我是 Symfony Doctrine 的新手,需要一些有关连接实体的帮助。
通常列是通过主键 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;
这样就可以了。
但问题是我想通过用户实体中的 id 字段连接关系 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\JoinColumn(name="id", referencedColumnName="user_id", nullable=true)
* })
*/
private $personDetails = null;
当我尝试以这种方式连接列时,出现错误
MainBundle\Entity\PersonDetails 上的主键 id 缺少值
是否可以索引除 id 之外的其他字段,或者我尝试做的事情是不可能的?
谢谢大家。
您混淆了
@JoinColumn
声明中应引用的列名称和字段名称。
@JoinColumn(name="id", referencedColumnName="user_id")
这样,Doctrine 就会在您的
user_id
实体上查找名为 User
的字段/属性。我猜您希望连接表中的列被命名为 user_id
并且条目是 id
实体的 User
。
用户详情
/**
* @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 |