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