在表2的组成主键的一部分上设置表1的外键

时间:2019-01-09 13:45:33

标签: php mysql symfony doctrine-orm symfony4

首先对不起我的英语)

我有下表:

1)拒绝原因

  • rejection_reason_id

  • 语言环境代码

  • 标题

主键: reject_reason_id,语言环境代码

2) order_rejection_reasons

  • order_id

  • rejection_reason_id

主键: order_id

外键: reject_reason_id(注意!,不包含字段 locale_code


实体:

class RejectionReason
{
    /**
     * @var int
     *
     * @ORM\Id
     * @ORM\Column(name="rejection_reason_id", type="smallint", length=1, nullable=false)
     */
    private $id;

    /**
     * @var string
     *
     * @ORM\Id
     * @ORM\Column(name="locale_code", type="string", length=2, nullable=false, options={"fixed"=true})
     */
    private $localeCode;

    /**
     * @ORM\OneToMany(targetEntity="OrderRejectionReason", mappedBy="rejectionReason", cascade={"remove", "persist"}, orphanRemoval=true)
     */
    private $orderRejectionReasons;

    /**
     * @param int    $id
     * @param string $localeCode
     */
    public function __construct($id, $localeCode)
    {
        $this->id                    = $id;
        $this->localeCode            = $localeCode;
        $this->orderRejectionReasons = new ArrayCollection();
    }
}

class OrderRejectionReason
{
    /**
     * @var int
     *
     * @ORM\Column(name="order_id", type="integer", nullable=false, options={"unsigned"=true})
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="IDENTITY")
     */
    private $id;

    /**
     * @var RejectionReason
     *
     * @ORM\ManyToOne(targetEntity="RejectionReason", inversedBy="orderRejectionReasons")
     * @ORM\JoinColumns({
     *   @ORM\JoinColumn(name="rejection_reason_id", referencedColumnName="rejection_reason_id", nullable=false, onDelete="CASCADE")
     * })
     */
    private $rejectionReason;
}

Doctrine返回错误:

关联“ rejectionReason”的联接列必须与目标实体“ App \ Entity \ RejectionReason”的所有标识符列匹配,但是缺少“ locale_code”。

您能帮我设置这些表之间的关系吗?

2 个答案:

答案 0 :(得分:2)

关联“ rejectionReason”的联接列必须与所有标识符列相匹配,因此您应该查看标识符列。如您所见,localcode也被标记为一个ID(@ORM \ Id)以及ID,这意味着您创建了一个复合主键。

看看:https://www.doctrine-project.org/projects/doctrine-orm/en/2.6/tutorials/composite-primary-keys.html

因为它是一个复合主键,所以不能仅与两个标识符(JoinColumn,referencedColumnName =“ id”)之一相关。

您可能会考虑使localeCode唯一,而不是ID,这应该可以解决您的问题。(因此,您必须确定localCode是否应为ID)。您还可以尝试将localCode添加到JoinColumn批注中。

答案 1 :(得分:0)

尝试不使用大括号和JoinColumn语句

class OrderRejectionReason
{
    /**
     * @var RejectionReason
     *
     * @ORM\ManyToOne(targetEntity="RejectionReason", inversedBy="orderRejectionReasons")
     * @ORM\JoinColumn(name="rejection_reason_id", referencedColumnName="id", nullable=false, onDelete="CASCADE")
     */
    private $rejectionReason;
}

编辑我: 添加了name="rejection_reason_id", referencedColumnName="rejection_reason_id"

编辑II: 将referencedColumnName="rejection_reason_id"更改为referencedColumnName="id"