Symfony2 - 继承 - 存储库查找方法

时间:2013-10-15 09:44:09

标签: symfony inheritance doctrine-orm

我有实体

<?php

namespace Proj\Bundle\MyBundle\Entity;

use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\Validator\Constraints as Assert;

/**
 * ClassTop
 *
 * @ORM\Table()
 * @ORM\Entity(repositoryClass="Proj\Bundle\MyBundle\Repository\ClassTopRepository")
 * @ORM\InheritanceType("SINGLE_TABLE")
 * @ORM\DiscriminatorColumn(name="aVal", type="string")
 * @ORM\DiscriminatorMap({ "ValOne" = "ClassSubOne", "ValTwo" = "ClassSubTwo", "ValThree" = "ClassSubThree" })
 * 
 */
class ClassTop
{
    .....
}

class ClassSubOne extends ClassTop
{
    ....
}

class ClassSubTwo extends ClassTop
{
    ....
}

class ClassSubThree extends ClassTop
{
    ....
}

我的问题是,当我调用find()(或findOneByfindAll等)方法时,我遇到了Oracle错误。

$entityManager->getRepository('ProjMyBundle:ClassSubOne')->findAll()

在查询中

SELECT field, field2 FROM CLASSTOP WHERE aVAL IN () 

鉴别器值"ValOne"未映射,不在Doctrine中传递。

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:0)

您需要为子类存储类而不是顶级类。您将子类视为完全定义的类,这就是全部。然后,当您需要查询实体时,不要使用顶级实体而是子类。我不知道我是否在这里说清楚了!

在你的情况下:

@ORM\Entity(repositoryClass="path\to\your\repository")

存储库行用于子类而不是顶级超类。所以你做了

/**
 *
 * @ORM\Entity(repositoryClass="path\to\your\ClassSubOneRepository")
 */
class ClassSubOne extends ClassTop
{
    ...
}

而不是

/**
 *
 * @ORM\Entity(repositoryClass="Proj\Bundle\MyBundle\Repository\ClassTopRepository")
 */
class ClassTop
{
    ...
}