У меня есть объект, называемый пользователем, у которого много друзей ... которые также являются пользователями. Некоторые из них уже зарегистрированы, а некоторые нет. Если это не так, я хотел бы добавить нового пользователя с полем «зарегистрированным», установленным в 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.
Как его оптимизировать?
Я использую 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 отн) и советы (о том, как оптимизировать это :)
Удивительный человек, я miised эту точку. Любая помощь для optmization случайно? –