通过不是主键的referencedColumnName连接列 - id

时间:2016-11-05 11:02:29

标签: symfony doctrine-orm

我是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之外的其他字段或我想要做的事情是不可能的?

谢谢你们。

1 个答案:

答案 0 :(得分:1)

您混淆了列名和要在@JoinColumn声明中引用的字段名称。

@JoinColumn(name="id", referencedColumnName="user_id")

这样,Doctrine会在user_id实体上查找名为User的字段/属性。我想你希望连接表中的列名为user_idid实体的条目为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       |