1

我有一个名为 Divers 的抽象父类,它由几个其他类扩展。
因此,我使用单表继承策略将继承映射与 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
{
    ...
}

我想要实现的是在浏览器中显示鉴别器,并带有一点描述,向用户解释它是什么。
我搜索了一个解决方案,比如将鉴别器放在一个连接表中,但什么也没找到。

你对实现我的目标有什么建议吗?

提前感谢您的帮助。

4

2 回答 2

4

鉴别器列对 Doctrine 2 具有特殊意义,因此不能成为关系的一部分。

但是有一个简单的解决方法。只需添加另一列并为其赋予与您的鉴别器列相同的值。该值永远不会改变,因此很容易做到。然后,您当然可以像使用任何其他列一样使用您的新列。

我知道从数据库的角度来看,具有相同值的两列并不理想。但从对象的角度来看,这没什么大不了的,因为鉴别器列从未作为属性公开。这就是教义的运作方式。它希望该列全部独占。

于 2013-08-27T14:05:29.880 回答
0

只要您不需要 SQL 查询中的字段,您就可以使用 PHP 来实现它,而无需在数据库中添加另一个字段。

由于鉴别器是abstract class,只需添加一个返回硬编码鉴别器值的公共抽象方法就可以了。然后,您可以在 twig 或 json 序列化程序中使用您的实体。

abstract class ParentClass {
    public abstract function getDiscriminator(): string; // The discriminator type
}

class ChildClassOne extends ParentClass
{
    public function getDiscriminator(): string 
    {
        return 'CHILD-CLASS1'; 
    }
}

如果需要在 SQL 中获取,请使用,$qb->andWhere($qb->isInstanceOf(ChildClassOne::class))因为方法或鉴别器属性在 sql 中不可用。

于 2019-12-16T20:24:59.700 回答