使用Doctrine2加入表中的鉴别器

时间:2013-08-27 12:55:15

标签: 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\DiscriminatorColumn(name="idtable", type="string")
 * @ORM\DiscriminatorMap({
 *      "CHILD-CLASS1" = "ChildClassOne",
 *      "CHILD-CLASS2" = "ChildClassTwo",
 *      "CHILD-CLASS3" = "ChildClassThree",
 *      "CHILD-CLASS4" = "ChildClassFour"
 * })
 */
abstract class ParentClass
{
    ...
}

我想要达到的目的是在浏览器中显示鉴别器,并附上一些说明,说明用户的含义。
我搜索了一个解决方案,比如将鉴别器放在连接表中但什么也没找到。

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

感谢您的帮助。

2 个答案:

答案 0 :(得分:3)

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

但是有一个简单的工作。只需添加另一列,并为其提供与鉴别器列相同的值。价值永远不会改变,所以很容易做到。然后,您可以使用与任何其他列相同的方式使用新列。

我知道从数据库的角度来看,有两个具有相同值的列并不理想。但从对象的角度来看,这并不是什么大问题,因为鉴别器列永远不会作为属性公开。这就是学说的作用方式。它希望该列全部为自己。

答案 1 :(得分:0)

您可以使用PHP实现此目的,只要在SQL查询中不需要该字段,就可以在db中添加另一个字段。

由于鉴别符是abstract class,只需添加一个公共抽象方法返回您的硬编码鉴别符值即可。然后,您可以在树枝或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)),因为method或discriminator属性在sql中不可用。