Symfony Doctrine - InheritanceType SINGLE_TABLE 在 Dicscriminator 改变但不是 Id 时不改变目标实体

Symfony Doctrine - InheritanceType SINGLE_TABLE is not changing target Entity when Dicscriminator changes but not Id

我正在尝试使用原则处理遗留数据库。 在不同的 table 中有许多字段是引用唯一代码 table CHOIXCOD 的代码。这个 table 依赖于两个键。与链接字段中的值对应的键 (CC_CODE),以及标识第一个键针对哪个字段的类型代码 (CC_TYPE)。

所以我在针对此代码的抽象实体上使用了 Doctrine Inheritance table,并创建了与不同类型一样多的 children 实体。 我的理解是,Doctrine 将在 CC_TYPE 字段上制作 CHOIXCOD 片段,并且在每个片段中,CC_CODE 将是关键列。

但是,当所有 $ccCode 都不同时一切正常,但是,在一个 table 中有多个对 CHOIXCOD 的引用,如果引用 CC_CODE 的两个字段具有相同的值,Doctrine 将给它们相同的 CC_TYPE 值,导致针对错误的实体、崩溃、500 错误、项目延迟、我被解雇。

所以这是母实体。

<?php

namespace App\Entity;


use Doctrine\ORM\Mapping as ORM;

/**
 * @ORM\Entity
 * @ORM\Table(name="CHOIXCOD")
 * @ORM\InheritanceType("SINGLE_TABLE")
 * @ORM\DiscriminatorColumn(name="CC_TYPE", type="string", length=3)
 * @ORM\DiscriminatorMap({"PHV" = "Phasevocale",
 *                        "TMS" = "Typemessage",
 *                        "PRI" = "Priorite",
 *                        "ZEL" = "Etatlivraison",
 *                        "ZEM" = "Etatmessage",
 *                        "ZOR" = "Originems"})
 */

abstract class Choixcod
{

    /**
     * @var string|null
     *
     * @ORM\Column(name="CC_CODE", type="string", length=3, nullable=true)
     * @ORM\Id
     */
    protected $ccCode;

    /**
     * @var string|null
     *
     * @ORM\Column(name="CC_LIBELLE", type="string", length=105, nullable=true)
     */
    protected $ccLibelle;

    /**
     * @var string|null
     *
     * @ORM\Column(name="CC_ABREGE", type="string", length=17, nullable=true)
     */
    protected $ccAbrege;

    /**
     * @var string|null
     *
     * @ORM\Column(name="CC_LIBRE", type="string", length=70, nullable=true)
     */
    protected $ccLibre;

所有children都是这样

<?php

namespace App\Entity;

use Doctrine\ORM\Mapping as ORM;

/**
* @ORM\Entity
*/
class Etatmessage extends Choixcod{}

然后它们会在遵循 ManyToOne 关系的其他实体中使用

    /**
     *
     * @ORM\ManyToOne(targetEntity="Etatmessage")
     * @ORM\JoinColumn(name="ZMS_ETATMESSAGE", referencedColumnName="CC_CODE")
     * @ToNull(primaryKey="ccCode")
     */
    private $zmsEtatmessage;

@ToNull 注释是我们编写的用于处理空或满空格的外键)。我试图删除它们,但没有任何改变。

欢迎提出任何想法。

好的,所以在为这个问题苦苦挣扎了一段时间之后,我了解到 Doctrine 存储了一个二维数组以请求连接(1-实体连接,2-id 实体实例)。我想目的是限制为已知实例完成的请求数量。

在我们的例子中,继承,数组的第一个维度是用扩展实体命名的,所以我对相同的第一个维度名称有相同的 ID,从一开始就搞砸了。将鉴别器设置为 @Id 可以解决这个问题,但是 Doctrine 不会自动在对象中设置鉴别器值,抛出一个 id missing 异常。

所以我保留的解决方案是在外键上放置一个注释,指定该外键对应的鉴别器值。遇到doctrinepostLoad事件,我请求数据库注解中的外键值(主键对应的是CC_CODE)和鉴别器(CC_TYPE的值),放入另一个字段。