Doctrine2.1:通过DiscriminatorColumn查找导致“未知字段”异常

时间:2012-05-11 12:00:31

标签: symfony doctrine-orm

我试图搜索这个错误但事实上我找不到任何东西让我相信我做的事情很傻。我将在下面包含相关代码,但基本上我使用多表继承(或Class Table Inheritance)并尝试使用Doctrine ORM findBy()方法根据鉴别器列进行查询,导致抛出以下ORMException:"无法识别的字段:type"。

以下是触发异常的代码:

    // $this->em is an instance of \Doctrine\ORM\EntityManager
    $repository = $this->em->getRepository('JoeCommentBundle:Thread');

    return $repository->findOneBy(array(
        'type' => $this->type,
        'related_id' => $id
    ));

以下是' base'的相关代码。抽象实体:

<?php

namespace Joe\Bundle\CommentBundle\Entity;

use Doctrine\ORM\Mapping as ORM;
use Gedmo\Mapping\Annotation as Gedmo;
use Doctrine\Common\Collections\ArrayCollection;

/**
 * @ORM\Entity
 * @ORM\Table(name="comment_threads")
 * @ORM\InheritanceType("JOINED")
 * @ORM\DiscriminatorColumn(name="type", type="string")
 * @ORM\DiscriminatorMap( {"story" = "Joe\Bundle\StoryBundle\Entity\StoryThread"} )
 */
abstract class Thread
{
    /**
     * @ORM\Id
     * @ORM\Column(type="integer")
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    protected $id;

    /**
     * @ORM\Column(name="related_id", type="integer")
     */
    protected $relatedId;

    /** MORE FIELDS BELOW.... **/

最后,这是具体线程实体的代码:

<?php

namespace Joe\Bundle\StoryBundle\Entity;

use Doctrine\ORM\Mapping as ORM;
use Joe\Bundle\CommentBundle\Entity\Thread as AbstractThread;

/**
 * @ORM\Entity
 * @ORM\Table(name="story_comment_threads")
 */
class StoryThread extends AbstractThread
{
    /**
     * @ORM\OneToOne(targetEntity="Story")
     * @ORM\JoinColumn(name="story_id", referencedColumnName="id")
     */
    protected $story;
}

我已经仔细检查了我的架构,并且type列肯定存在,所以我不确定是什么原因造成的。有任何想法吗?感谢。

2 个答案:

答案 0 :(得分:15)

Rob,在查询实际使用父实体并尝试过滤鉴别器值时。而是相对于要获取的子实体处理存储库。学说将为你做其余的事情。因此,在您的情况下,您希望获得 StoryThread 的存储库。

$repository = $this->em->getRepository('JoeCommentBundle:StoryThread');
return repository->find($id);

答案 1 :(得分:12)

您不能将discriminator列用作标准实体属性。

相反,您可以执行以下操作:

$dql = 'SELECT e FROM JoeCommentBundle:Thread e 
    WHERE e.related_id = :related_id AND e INSTANCE OF :type';
$query = $em->createQuery($dql);
$query->setParameters(array(
    'type' => $this->type,
    'related_id' => $id
));
$record = $query->getSingleResult();