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
的值),放入另一个字段。
我正在尝试使用原则处理遗留数据库。 在不同的 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
的值),放入另一个字段。