许多ToMany上的学说延迟加载。
我在我的博客(帖子)中使用Application\Sonata\ClassificationBundle\Entity\Tag
。
/**
* @var string
*
* @ORM\ManyToMany(targetEntity="\Application\Sonata\ClassificationBundle\Entity\Tag", cascade={"persist"} )
* @ORM\JoinTable( name="blog__post_tag" ,
* joinColumns={ @ORM\JoinColumn( name="blog_post_id", referencedColumnName="id" )},
* inverseJoinColumns={ @ORM\JoinColumn( name="tag_id", referencedColumnName="id" )}
* )
*/
private $tags;
工作代码:
$q = $this->createQueryBuilder('p')
->select('p')
->innerJoin('p.tags', 't')
->where('t = :name')->setParameter('name', $tag)
->andWhere('p.isActive = :active')->setParameter('active', TRUE)
->orderBy('p.id', 'DESC');
return $q->getQuery();
从这个输出查询我在树枝中使用标签。所以我必须选择帖子和标签。如果我将代码更新为:
$q = $this->createQueryBuilder('p')
->select('p', 't')
->innerJoin('p.tags', 't')
->where('t = :name')->setParameter('name', $tag)
->andWhere('p.isActive = :active')->setParameter('active', TRUE)
->orderBy('p.id', 'DESC');
return $q->getQuery();
我只得到一个标签。
信息:
示例:
当我使用第一个查询时。工作良好。但标签的学说延迟加载代码。我得到输出(query1)两个 =“我的第一个帖子”有标签['one','two','three']。 ,“我的第二篇文章”有标签['two']。
当我使用第二个查询时。 (query2)两个 =“我的第一个帖子”的输出有标签['two']。 ,“我的第二篇文章”有标签['two']。
我需要帖子中的所有标签。目前我只从帖子中获得一个标签。
答案 0 :(得分:1)
因为INNER JOIN而是这样的。关于联接类型的好答案在这里:https://stackoverflow.com/a/6188334/919567
此版本的查询适用于您:
$q = $this->createQueryBuilder('p')
->select('p', 't')
->leftJoin('p.tags', 't')
->where('t = :name')->setParameter('name', $tag)
->andWhere('p.isActive = :active')->setParameter('active', TRUE)
->orderBy('p.id', 'DESC');
return $q->getQuery();
答案 1 :(得分:0)
Sudhakar K,你绝对应该使用Pawel的答案,如果这对你有用 - 我怀疑它会,但仍然。
这里的事情是你不能在不到2个请求中找到你想要的结果,因为你试图同时做两件事:
Post
Tag
个实体
Tag
实体Post
个实体
醇>
......以及具有相同联接的所有内容,这似乎是完全不可能的。由于您要对要检索的Tag
施加条件,因此唯一检索到的Tag
实体将是满足该条件的实体,即具有您搜索名称的Tag
。
你必须对同一个表进行多次连接才能使其工作,即便如此,我怀疑它会以你想要的方式工作。
请记住,Doctrine的设计更易于使用,而非性能。在使用Doctrine IMHO时,试图以这种方式阻止低成本,单一额外请求会适得其反。
知道这一点,我强烈建议您使用第一个解决方案。