我是Symfony Doctrine的新手,需要一些关于Join实体的帮助。
通常,列是按主键ID
连接的/**
* User
*
* @ORM\Table(name="users")
* @ORM\Entity(repositoryClass="MainBundle\Repository\UserRepository")
* UniqueEntity("email", message="Account with email already exists.")
*/
class User implements AdvancedUserInterface, \Serializable
{
/**
* @var \MainBundle\Entity\PersonDetails
*
* @ORM\ManyToOne(targetEntity="MainBundle\Entity\Person")
* @ORM\JoinColumns({
* @ORM\JoinColumn(name="person_details_id", referencedColumnName="id", nullable=true)
* })
*/
private $personDetails = null;
没关系。
但问题是我想通过User Entity中的id字段加入Relation OneToOne中的两列
/**
* User
*
* @ORM\Table(name="users")
* @ORM\Entity(repositoryClass="MainBundle\Repository\UserRepository")
* UniqueEntity("email", message="Account with email already exists.")
*/
class User implements AdvancedUserInterface, \Serializable
{
/**
* @var \MainBundle\Entity\PersonDetails
*
* @ORM\ManyToOne(targetEntity="MainBundle\Entity\Person")
* @ORM\JoinColumns({
- @ORM \ JoinColumn(name =" id",referencedColumnName =" user_id",
nullable=true)
* })
*/
private $personDetails = null;
当我尝试以这种方式加入列时,我收到错误
缺少MainBundle \ Entity \ PersonDetails上的主键ID值
是否可以索引除id之外的其他字段或我想要做的事情是不可能的?
谢谢你们。
答案 0 :(得分:1)
您混淆了列名和要在@JoinColumn
声明中引用的字段名称。
@JoinColumn(name="id", referencedColumnName="user_id")
这样,Doctrine会在user_id
实体上查找名为User
的字段/属性。我想你希望连接表中的列名为user_id
,id
实体的条目为User
。
<强> UserDetail 强>
/**
* @ORM\Entity
*/
class UserDetail
{
/**
* @ORM\ManyToOne(
* targetEntity="User",
* inversedBy="details"
* )
* @ORM\JoinColumn(
* name="user_id",
* referencedColumnName="id"
* )
*/
protected $user;
public function setUser(User $user)
{
$this->user = $user;
return $this;
}
/** @ORM\Column() */
protected $key;
/** @ORM\Column() */
protected $value;
public function __construct($key, $value)
{
$this->key = $key;
$this->value = $value;
}
用户强>
class User
{
/**
* @ORM\Id()
* @ORM\Column(type="integer")
*/
protected $id;
/**
* @ORM\OneToMany(
* targetEntity="UserDetail",
* mappedBy="user",
* cascade={
* "persist",
* "remove",
* "merge"
* },
* orphanRemoval=true
* )
*/
protected $details;
public function __construct()
{
$this->details = new ArrayCollection();
}
public function addDetail(UserDetail $detail)
{
$detail->setUser($this);
$this->details->add($detail);
return $this;
}
现在,如果您向User
添加一个详细信息,并在之后保持/刷新:
$user->addDetail(new UserDetail('Height', '173cm'));
这将导致user_detail
表中的连接列如下所示:
| key | value | user_id |
|---------------|-----------|---------|
| Height | 173cm | 1 |