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

slmsl1lt  于 2021-06-15  发布在  Mysql
关注(0)|答案(2)|浏览(359)

首先对不起我的英语)
我有以下表格:
1) 拒绝原因
拒绝原因\u id
区域设置\u代码
标题
主键:拒绝\u原因\u id、区域设置\u代码
2) 订单拒绝原因
订单号
拒绝原因\u id
主键:订单号
外键:拒绝原因id(注意!无字段区域设置(U代码)
实体:

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\u code”。
你能帮我把这些table之间的关系定好吗?

fhg3lkii

fhg3lkii1#

试着不用额外的花括号和 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"

2jcobegt

2jcobegt2#

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

相关问题