有一个带有复合键的元素类。 当我运行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;
}
答案 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;
}