Symfony 2.3使用组合键连接表


Symfony 2.3 Join tables using composite keys

有一个带有复合键的元素类。当我运行php应用程序/控制台原则时:模式:验证我得到以下错误

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

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

<?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;
}

我太愚蠢了,我把所有的映射都搞混了。。。

我解决了我的问题。

首先,我决定删除id并拥有uuid,这意味着我不需要复合密钥。

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

然后删除$parentUUID。我做得不对,不理解映射,在不需要的时候使用了额外的引用。

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

父联接注释上的名称需要是关联的类成员的名称。

<?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;
}