我有一个名为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 中的示例与您的情况类似