Учение. Один ко многим. Как писать аннотации?
У меня есть отношение OneToMany между двумя таблицами 'user' и 'profil' (у пользователя есть только один профиль, и профиль может быть собран для многих пользователей). Я получаю эту ошибку всякий раз, когда пытаюсь обновить схему в консоли доктрины.
вот мои две сущности:
<?php
namespace CNAM\CMSBundle\Entity;
use Doctrine\ORM\Mapping as ORM;
use Doctrine\Common\Collections\ArrayCollection;
use Symfony\Component\Validator\Constraints as Assert;
use Symfony\Component\Security\Core\User\UserInterface;
use Doctrine\ORM\Mapping\ManyToOne;
/**
* user
*
* @ORM\Table(name="user")
* @ORM\Entity
*/
class user
{
/**
* @var integer
*
* @ORM\Column(name="id", type="integer")
* @ORM\Id
*/
private $id;
/**
* @var string
*
* @ORM\Column(name="password", type="string", length=40)
*/
private $password;
public function __construct()
{
}
/**
* @var boolean
*
* @ORM\Column(name="etat", type="boolean")
*/
private $etat;
/**
* @var profil $profil
*
* @ORMManyToOne(targetEntity="profil", inversedBy="users", cascade={"persist", "merge"})
* @ORMJoinColumns({
* @ORMJoinColumn(name="profil", referencedColumnName="id")
* })
*/
private $profil;
/**
* Get id
*
* @return integer
*/
public function getId()
{
return $this->id;
}
/**
* Set id
*
* @param integer $id
* @return user
*/
public function setId($id)
{
$this->id = $id;
return $this;
}
/**
* Set password
*
* @param string $password
* @return user
*/
public function setPassword($password)
{
$this->password = $password;
return $this;
}
/**
* Get password
*
* @return string
*/
public function getPassword()
{
return $this->password;
}
/**
* Set etat
*
* @param boolean $etat
* @return user
*/
public function setEtat($etat)
{
$this->etat = $etat;
return $this;
}
/**
* Get etat
*
* @return boolean
*/
public function getEtat()
{
return $this->etat;
}
/**
* Get profil
*
* @return integer
*/
public function getProfil()
{
return $this->profil;
}
/**
* Set profil
*
* @param integer $profil
* @return user
*/
public function setProfil($profil)
{
$this->profil = $profil;
return $this;
}
public function getUsername()
{
return $this->id;
}
public function getRoles()
{
return array('ROLE_USER');
}
public function getSalt()
{
return null;
}
public function eraseCredentials()
{
}
public function equals(UserInterface $user)
{
return $user->getId() == $this->getId();
}
}
<?php
namespace CNAM\CMSBundle\Entity;
use Doctrine\ORM\Mapping as ORM;
use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\ORM\Mapping\OneToMany;
/**
* profil
*
* @ORM\Table(name="profil")
* @ORM\Entity
*/
class profil
{
/**
* @var integer
*
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;
/**
* @var string
*
* @ORM\Column(name="libelle", type="string", length=20)
*/
private $libelle;
/**
* @var ArrayCollection $users
*
* @ORMOneToMany(targetEntity="user", mappedBy="profil", cascade={"persist", "remove", "merge"})
*/
private $users;
public function __construct()
{
}
/**
* Get id
*
* @return integer
*/
public function getId()
{
return $this->id;
}
/**
* Set libelle
*
* @param string $libelle
* @return profil
*/
public function setLibelle($libelle)
{
$this->libelle = $libelle;
return $this;
}
/**
* Get libelle
*
* @return string
*/
public function getLibelle()
{
return $this->libelle;
}
/**
* Set id
*
* @param integer $id
* @return profil
*/
public function setId($id)
{
$this->id = $id;
return $this;
}
public function __toString() {
return $this->libelle;
}
}
1 ответ
У вас есть синтаксическая ошибка.
@ORMManyToOne
- это ошибка.@ORM\ManyToOne(targetEntity="Profil", inversedBy="users")
Выше будет правильно. И везде, где вы используете ORM, вам нужно написать ORM \ что-нибудь. ORM - это просто пространство имен или просто путь к классам ORM в каталоге поставщика доктрины!
Каждое имя класса должно начинаться с заглавной буквы. Это правильный путь! Так что вы должны написать
class User
, но нетclass user
!Вы не показали в классе Profil, что у вас много пользователей для каждого профиля. поле users будет иметь тип коллекции массивов (простой массив, но с полезными методами). Так в классе Profil в
__construct()
метод:public function __construct() { $this->users = new ArrayCollection(); }
Вы имеете двунаправленное отношение "один ко многим". Ты можешь сказать:
- Каждый (ОДИН) профиль может иметь много (МНОГИЕ) пользователей, которые его используют (один-ко-многим)
- Каждый пользователь может использовать только один точный профиль
Так попробуй это
// Class Profil
/**
* Bidirectional - One-To-Many (INVERSED SIDE)
* One Profile can have many users, which use it
*
* @var ArrayCollection $users
*
* @ORM\OneToMany(targetEntity="Path-to-your-user-class\Users", mappedBy="profil", cascade={"persist", "remove"}, orphanRemoval=true)
*/
private $users;
public function __construct()
{
$this->users = new ArrayCollection();
}
// Class user
/**
* Bidirectional - One-To-Many (OWNER SIDE)
* One user have only one profile (or profil)
*
* @var Profil $profil
*
* @ORM\ManyToOne(targetEntity="AppBundle\Entity\Profil", inversedBy="users")
* @ORM\JoinColumn(name="profil_id", referencedColumnName="id")
*/
private $profil;