我有一个名为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)和建议(关于如何优化它):
答案 0 :(得分:1)