簡體   English   中英

如何正確地建立一個多對多學說的自我參照關系?

[英]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。

我該如何優化呢?

我正在使用CodeIgniter和Doctrine 2。 現在,我的函數如下所示:

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)和建議(如何優化它:)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM