教义。一对多。注释怎么写?
Doctrine. One to many. How to write annotations?
我在两个表 'user' 和 'profil' 之间有一对多关系
(一个用户只有一个配置文件,一个配置文件可以分配给多个用户)
每当我尝试更新 doctrine 控制台中的模式时,我都会收到此错误。
这是我的两个实体:
<?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;
}
}
你有语法错误。
@ORMManyToOne
- 这是个错误。
@ORM\ManyToOne(targetEntity="Profil", inversedBy="users")
以上是正确的。而且到处用ORM都需要写ORM\something。 ORM - 只是一个命名空间,或者只是指向 ORM classes 在 doctrine vendor 目录中的路径!
每个 class 名称都应以大写字母开头。这是一个正确的方式!所以你应该写class User
,而不是class user
!
您没有在配置文件 class 中显示每个配置文件都有很多用户。 users 字段将是数组集合类型(简单数组但有有用的方法。)所以在 Profil class 中 __construct()
方法中:
public function __construct()
{
$this->users = new ArrayCollection();
}
你有一对多的双向关系。
你可以说:
- 每个(ONE)个人资料可以有很多(MANY)用户使用它(一对多)
- 每个用户只能使用一个准确的配置文件
所以试试这个
// 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;
我在两个表 'user' 和 'profil' 之间有一对多关系 (一个用户只有一个配置文件,一个配置文件可以分配给多个用户) 每当我尝试更新 doctrine 控制台中的模式时,我都会收到此错误。
这是我的两个实体:
<?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;
}
}
你有语法错误。
@ORMManyToOne
- 这是个错误。@ORM\ManyToOne(targetEntity="Profil", inversedBy="users")
以上是正确的。而且到处用ORM都需要写ORM\something。 ORM - 只是一个命名空间,或者只是指向 ORM classes 在 doctrine vendor 目录中的路径!
每个 class 名称都应以大写字母开头。这是一个正确的方式!所以你应该写
class User
,而不是class user
!您没有在配置文件 class 中显示每个配置文件都有很多用户。 users 字段将是数组集合类型(简单数组但有有用的方法。)所以在 Profil class 中
__construct()
方法中:public function __construct() { $this->users = new ArrayCollection(); }
你有一对多的双向关系。 你可以说:
- 每个(ONE)个人资料可以有很多(MANY)用户使用它(一对多)
- 每个用户只能使用一个准确的配置文件
所以试试这个
// 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;