如何正确建立多对多的自我引用关系


How to properly set up a Doctrine Many To Many self referencing relation?

我有一个名为user的实体,它有很多朋友...哪些也是用户。有些已经注册,有些尚未注册。如果不是,我想添加一个字段"已注册"设置为 0 的新用户,以说"这是用户 X 的朋友,但他不在应用程序上"

所以在实体中,我尝试以这种方式设置它(我简化了实体):

<?php
namespace Entity;
use Doctrine'ORM'Mapping as ORM;
/**
 * User
 *
 * @ORM'Table(name="user")
 * @ORM'Entity
 */
class User
{
    /**
     * @var integer
     *
     * @ORM'Column(name="id", type="integer", nullable=false, unique=true)
     * @ORM'Id
     * @ORM'GeneratedValue(strategy="IDENTITY")
     */
    private $id;
    /**
     * @var 'Doctrine'Common'Collections'Collection
     *
     * @ORM'ManyToMany(targetEntity="Entity'User", mappedBy="user", cascade={"persist"})
     */
    private $friends;
    /**
     * @var boolean
     *
     * @ORM'Column(name="isregistered", type="boolean", length=1, nullable=false, unique=false)
     */
    private $registered;

    /**
     * Constructor
     */
    public function __construct()
    {
        $this->friends = new 'Doctrine'Common'Collections'ArrayCollection();
    }
    // GETTERS AND SETTERS
}

我不确定这是正确的方法..是吗?

另一方面,这就是我有点卡住的地方。我希望,当用户注册(我从FB中抓取他的所有朋友)时,我设置了一个脚本来检查某些朋友是否已经注册,如果是,只需添加用户和他的朋友(另一个用户)之间的多对多关系如果没有,创建一个只有他的名字的配置文件,注册设置为0。

如何优化它?

我正在使用原则 2 和 codeIgniter。现在,我的函数如下所示:

public function register()
    {
        //Gestion du Formulaire
        $this->load->library( 'form_validation' );
        $this->form_validation->set_rules( 'id', 'Facebook Id', 'trim|xss_clean|required' );
        $this->form_validation->set_rules( 'first_name', 'First Name', 'trim|xss_clean|required' );
        $this->form_validation->set_rules( 'last_name', 'Last Name', 'trim|xss_clean|required' );
        $this->form_validation->set_rules( 'gender', 'gender', 'trim|xss_clean|required' );
        $this->form_validation->set_rules( 'email', 'email', 'trim|xss_clean|required' );
        $this->form_validation->set_rules( 'picture', 'picture', 'trim|xss_clean|required' );
        if( $this->form_validation->run() )
        {
            //Use Doctrine to register a new user
            $em = $this->doctrine->em;
            $user = new Entity'User;
            $user->setFbId( $this->input->post( 'id' ) );
            $user->setFirstName( $this->input->post( 'first_name' ) );
            $user->setLastName( $this->input->post( 'last_name' ) );
            $user->setGenre( $this->input->post( 'gender' ) );
            $user->setEmail( $this->input->post( 'email' ) );
            $user->setPicture( $this->input->post( 'picture' ) );
            $user->setRegistered( 1 );
            foreach ( $this->input->post( 'friends' ) as $key => $friend ) {
                //Check if the friend is registered with his $friend['id']
                $isFriendRegistered = $em->getRepository( 'Entity'User' )->findOneBy( array( 'fb_id' => $friend['id'] ) );
                if ( $isFriendRegistered ) { // He is registered
                    // then add a relation between those two users
                    $user->setFriends( $friend['id'] );
                }
                else{ // He is not registered
                    // Add a new user with Firstname, fb id and Id
                    $friendToRegister = new Entity'User;
                    $friendToRegister->setFbId( $friend['id'] );
                    $friendToRegister->setFirstName( $friend['name'] );
                    $user->setFriends( $friend['id'] );
                }
            }
            // We can now persist this entity:
            try
            {
                $em->persist( $user );
                $em->flush();
            }
            catch('PDOException $e)
            {
                // Error When Persisting the Entity !!
                $array = array(
                               'errors' => "<p>Server Error</p>",
                               'logged_in' => FALSE
                           );
                $this->output
                     ->set_content_type( 'application/json' )
                     ->set_output( json_encode( $array ) );
                return FALSE;
            }
            //Everything is fine
            $array = array(
                           'logged_in' => FALSE,
                           'success' => TRUE,
                       );
            $this->output
                 ->set_content_type( 'application/json' )
                 ->set_output( json_encode( $array ) );
            return TRUE;
        }
        //Error in the Form validation
        $this->output
             ->set_content_type( 'application/json' )
             ->set_output( json_encode( array(  'errors' => validation_errors(),
                                                'logged_in' => FALSE 
                                              ) ) );
        return FALSE;
    }

我对它的外观不满意,我很确定我错过了一些东西,因为我从未将多对多关系指向同一实体。

感谢您的帮助(做一个自我参考MTM关系)和建议(关于如何优化它:)

你看过文档吗?

http://docs.doctrine-project.org/en/latest/reference/association-mapping.html#many-to-many-self-referencing 中的示例与您的情况类似