有一个带有复合键的元素类。当我运行php应用程序/控制台原则时:模式:验证我得到以下错误
关联"parentElement"的联接列必须与匹配目标实体的所有标识符列"AgRecord\AppBundle\Entity\Element",但是"id,parent_uid"是丢失的
我缺少什么,或者我如何正确描述这种关系?
<?php
use DoctrineORMMapping as ORM;
/**
* Elements
*
* @ORMTable(name="elements",uniqueConstraints={@ORMUniqueConstraint(name="search_idx", columns={"uuid", "id", "parent_uuid"})})
* @ORMEntity
*/
class Element
{
/**
* @var integer
*
* @ORMColumn(name="id", type="integer", columnDefinition="INT AUTO_INCREMENT UNIQUE")
* @ORMId
*/
private $id;
/**
* @var guid
* @ORMId
* @ORMColumn(name="uuid", type="string", unique=true, nullable=false)
*/
private $uuid;
/**
* @var guid
* @ORMId
* @ORMColumn(name="parent_uuid", type="string")
*/
private $parentUUID;
/**
* @ORMManyToOne(targetEntity="Element", inversedBy="childElements")
* @ORMJoinColumn(name="uuid", referencedColumnName="parent_uuid")
*/
private $parentElement;
/**
* @ORMId
* @ORMOneToMany(targetEntity="Element", mappedBy="parentElement")
* @ORMJoinColumn(name="uuid", referencedColumnName="element_uuid")
*/
private $childElements;
}
我太愚蠢了,我把所有的映射都搞混了。。。
我解决了我的问题。
首先,我决定删除id并拥有uuid,这意味着我不需要复合密钥。
然后需要删除所有非主要字段中愚蠢放置的@Id
然后删除$parentUUID。我做得不对,不理解映射,在不需要的时候使用了额外的引用。
然后从子元素中删除了连接的注释,并确保在父元素上正确设置了invertedby。
父联接注释上的名称需要是关联的类成员的名称。
<?php
use DoctrineORMMapping as ORM;
/**
* Elements
*
* @ORMTable(name="elements")
* @ORMEntity
*/
class Element
{
private $id;
/**
* @var guid
* @ORMId
* @ORMColumn(name="uuid", type="string", unique=true, nullable=false)
*/
private $uuid;
/**
* @ORMManyToOne(targetEntity="Element", inversedBy="childElements")
* @ORMJoinColumn(name="parentElement", referencedColumnName="uuid")
*/
private $parentElement;
/**
* @ORMOneToMany(targetEntity="Element", mappedBy="parentElement")
*/
private $childElements;
}