Rob*_*ers 5 symfony doctrine-orm
我试图寻找这个错误但事实上我没有找到任何东西让我相信我做的事情很傻.我将在下面包含相关代码,但基本上我使用多表继承(或类表继承)并尝试使用Doctrine ORM findBy()方法基于discriminator列进行查询,这导致以下ORMException被抛出:"无法识别的字段:类型".
以下是触发异常的代码:
// $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
));
Run Code Online (Sandbox Code Playgroud)
以下是"基础"抽象实体的相关代码:
<?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.... **/
Run Code Online (Sandbox Code Playgroud)
最后,这是具体线程实体的代码:
<?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;
}
Run Code Online (Sandbox Code Playgroud)
我已经仔细检查了我的架构,并且该type列肯定存在,所以我不确定是什么原因造成的.有任何想法吗?谢谢.
Lee*_*vis 15
Rob,在查询您实际使用父实体并尝试过滤鉴别器值时.而是相对于要获取的子实体处理存储库.学说将为你做其余的事情.因此,在您的情况下,您想要获取StoryThread的存储库.
$repository = $this->em->getRepository('JoeCommentBundle:StoryThread');
return repository->find($id);
Run Code Online (Sandbox Code Playgroud)
Ged*_*rox 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();
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
10995 次 |
| 最近记录: |