首页 > 解决方案 > 在 table2 的部分组成主键上设置 table1 的外键

问题描述

首先对不起我的英语)

我有以下表格:

1)拒绝原因

主键: rejection_reason_id、locale_code

2) order_rejection_reasons

主键: order_id

外键: rejection_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;
}

教义返回错误:

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

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

标签: phpmysqlsymfonydoctrine-ormsymfony4

解决方案


关联“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 注释。


推荐阅读