Symfony 2.3使用复合键连接表

时间:2016-05-08 23:19:43

标签: php symfony orm doctrine-orm

有一个带有复合键的元素类。 当我运行php app / console doctrine:schema:validate 我收到以下错误

  

关联'parentElement'的连接列必须匹配   目标实体的所有标识符列   'AgRecord \ AppBundle \ Entity \ Element',但'id,parent_uuid'是   丢失。

我缺少什么或如何正确描述这段关系?

<?php

use Doctrine\ORM\Mapping as ORM;

/**
 * Elements
 *
 * @ORM\Table(name="elements",uniqueConstraints={@ORM\UniqueConstraint(name="search_idx", columns={"uuid", "id", "parent_uuid"})})
 * @ORM\Entity
 */
class Element
{


    /**
     * @var integer
     *
     * @ORM\Column(name="id", type="integer", columnDefinition="INT AUTO_INCREMENT UNIQUE")
     * @ORM\Id
     */
    private $id;   

    /**
     * @var guid
     * @ORM\Id
     * @ORM\Column(name="uuid", type="string", unique=true, nullable=false)
     */
    private $uuid;

    /**
     * @var guid
     * @ORM\Id
     * @ORM\Column(name="parent_uuid", type="string")
     */
    private $parentUUID;


    /**
    * @ORM\ManyToOne(targetEntity="Element", inversedBy="childElements")
    * @ORM\JoinColumn(name="uuid", referencedColumnName="parent_uuid")
    */
    private $parentElement;


    /**
    * @ORM\Id
    * @ORM\OneToMany(targetEntity="Element", mappedBy="parentElement")
    * @ORM\JoinColumn(name="uuid", referencedColumnName="element_uuid")
    */
    private $childElements;

}

1 个答案:

答案 0 :(得分:1)

我是愚蠢的,我把所有的映射混淆了......

我解决了我的问题。

首先我决定删除id并使用uuid,这意味着我不需要复合键。

然后需要从所有非主要字段中删除愚蠢的@Id

然后删除了$ parentUUID。 我这样做是错误的,并且不理解映射,并且在不需要时使用额外的引用。

然后从子元素中删除连接的注释,并确保在父元素上正确设置了反转注释。

父联接注释上的名称必须是关联的类成员的名称。

<?php

use Doctrine\ORM\Mapping as ORM;

/**
 * Elements
 *
 * @ORM\Table(name="elements")
 * @ORM\Entity
 */
class Element
{

    private $id;   

    /**
     * @var guid
     * @ORM\Id
     * @ORM\Column(name="uuid", type="string", unique=true, nullable=false)
     */
    private $uuid;

    /**
    * @ORM\ManyToOne(targetEntity="Element", inversedBy="childElements")
    * @ORM\JoinColumn(name="parentElement", referencedColumnName="uuid")
    */
    private $parentElement;


    /**
    * @ORM\OneToMany(targetEntity="Element", mappedBy="parentElement")
    */
    private $childElements;

}