Php 具有Doctrine2的联接表中的鉴别器
我有一个名为Divers的抽象父类,它被其他几个类扩展。Php 具有Doctrine2的联接表中的鉴别器,php,symfony,doctrine-orm,discriminator,Php,Symfony,Doctrine Orm,Discriminator,我有一个名为Divers的抽象父类,它被其他几个类扩展。 因此,我使用单表继承策略对D2使用继承映射 namespace MyBundle\Entity; use Doctrine\ORM\Mapping as ORM; /** * ParentClass * * @ORM\Table(name="PARENTCLASS") * @ORM\Entity * @ORM\InheritanceType("SINGLE_TABLE") * @ORM\DiscriminatorColu
因此,我使用单表继承策略对D2使用继承映射
namespace MyBundle\Entity;
use Doctrine\ORM\Mapping as ORM;
/**
* ParentClass
*
* @ORM\Table(name="PARENTCLASS")
* @ORM\Entity
* @ORM\InheritanceType("SINGLE_TABLE")
* @ORM\DiscriminatorColumn(name="idtable", type="string")
* @ORM\DiscriminatorMap({
* "CHILD-CLASS1" = "ChildClassOne",
* "CHILD-CLASS2" = "ChildClassTwo",
* "CHILD-CLASS3" = "ChildClassThree",
* "CHILD-CLASS4" = "ChildClassFour"
* })
*/
abstract class ParentClass
{
...
}
我想要实现的是在浏览器中显示鉴别器,并提供一点说明,向用户解释鉴别器是什么。我在谷歌上搜索了一个解决方案,比如把鉴别器放在一个连接表中,但什么也没找到 你有什么建议来实现我的目标吗
提前感谢您的帮助。鉴别器列对原则2有特殊意义,因此不能成为关系的一部分 但有一个简单的方法。只需添加另一列,并为其提供与鉴别器列相同的值。该值永远不会改变,因此很容易实现。当然,您可以像使用任何其他列一样使用新列
我知道从数据库的角度来看,拥有两个具有相同值的列并不理想。但从对象的角度来看,这没什么大不了的,因为discriminator列从未作为属性公开。这就是教义的运作方式。它希望该列完全属于它自己。您可以使用PHP实现它,而无需在数据库中添加另一个字段,只要您不需要SQL查询中的字段 由于鉴别器是一个
抽象类
,只需添加一个返回硬编码鉴别器值的公共抽象方法就可以了。然后,您可以在twig或json序列化程序中使用您的实体
抽象类父类{
公共抽象函数getDiscriminator():string;//鉴别器类型
}
类ChildClassOne扩展了ParentClass
{
公共函数getDiscriminator():字符串
{
返回'CHILD-CLASS1';
}
}
如果需要获取SQL,请使用
$qb->andWhere($qb->isInstanceOf(ChildClassOne::class))
,因为SQL中没有方法或鉴别器属性。您正在寻找一种方法来显示细枝模板中鉴别器列中存储的字符串?是的,以及如何将另一个字段附加到此鉴别器。这就是为什么我说的是一个包含鉴别器和另一个字段作为列的联接表。根据鉴别器字段添加另一个字段应该可以使用postPersist/postUpdate侦听器轻松实现。是的。我考虑过这个解决方案,但第一次就拒绝了,因为从数据库的角度来看,它并不理想。我想我现在就来。谢谢你的帮助。