如何正确建立一个多对多的学说自我引用关系?

时间:2013-11-15 16:27:56

标签: php facebook codeigniter symfony doctrine-orm

我有一个名为user的实体,它有很多朋友......也是用户。有些已经注册,有些则没有注册。如果他们不是,我想添加一个带有字段的新用户"注册"设置为0表示"它是用户X的朋友,但他不在应用程序上#34;

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

<?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。

我该如何优化它?

我使用Doctrine 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 rel)和建议(关于如何优化它):

1 个答案:

答案 0 :(得分:1)