我试图搜索这个错误,但我没有找到任何东西的事实让我相信我在做一些愚蠢的事情。我将在下面包含相关代码,但基本上我正在使用多表继承(或类表继承)并尝试使用 Doctrine ORM findBy() 方法基于鉴别器列进行查询,这导致抛出以下 ORMException:"无法识别的字段:类型"。
下面是触发异常的代码:
// $this->em is an instance of DoctrineORMEntityManager
$repository = $this->em->getRepository('JoeCommentBundle:Thread');
return $repository->findOneBy(array(
'type' => $this->type,
'related_id' => $id
));
以下是"基本"抽象实体的相关代码:
<?php
namespace JoeBundleCommentBundleEntity;
use DoctrineORMMapping as ORM;
use GedmoMappingAnnotation as Gedmo;
use DoctrineCommonCollectionsArrayCollection;
/**
* @ORMEntity
* @ORMTable(name="comment_threads")
* @ORMInheritanceType("JOINED")
* @ORMDiscriminatorColumn(name="type", type="string")
* @ORMDiscriminatorMap( {"story" = "JoeBundleStoryBundleEntityStoryThread"} )
*/
abstract class Thread
{
/**
* @ORMId
* @ORMColumn(type="integer")
* @ORMGeneratedValue(strategy="AUTO")
*/
protected $id;
/**
* @ORMColumn(name="related_id", type="integer")
*/
protected $relatedId;
/** MORE FIELDS BELOW.... **/
最后,下面是具体线程实体的代码:
<?php
namespace JoeBundleStoryBundleEntity;
use DoctrineORMMapping as ORM;
use JoeBundleCommentBundleEntityThread as AbstractThread;
/**
* @ORMEntity
* @ORMTable(name="story_comment_threads")
*/
class StoryThread extends AbstractThread
{
/**
* @ORMOneToOne(targetEntity="Story")
* @ORMJoinColumn(name="story_id", referencedColumnName="id")
*/
protected $story;
}
我已经仔细检查了我的架构,type
列肯定存在,所以我不确定是什么原因造成的。有什么想法吗?谢谢。
Rob,当查询您实际使用父实体并尝试过滤鉴别器值时。相反,应处理相对于要获取的子实体的存储库。教义将为你做剩下的事情。因此,在您的情况下,您希望获取StoryThread的存储库。
$repository = $this->em->getRepository('JoeCommentBundle:StoryThread');
return repository->find($id);
不能将鉴别器列用作标准实体属性。
相反,您可以执行以下操作:
$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();