Symfony Doctrine ORM ManyToMany - 带标签的博客 - 我没有从博客中获取所有标签,没有延迟加载

时间:2016-02-22 06:12:57

标签: php mysql symfony orm doctrine-orm

  

许多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();

我只得到一个标签。

信息:

  • 工作代码使用更多数据库查询(另外1个查询)。
  • 更新的代码有效(不再查询)。但是在结果中我得到所有帖子的只有一个标签

示例:

  • “我的第一篇文章”有标签['one','two','three']。
  • “我的第二篇文章”有标签['two']。

当我使用第一个查询时。工作良好。但标签的学说延迟加载代码。我得到输出(query1)两个 =“我的第一个帖子”有标签['one','two','three']。 ,“我的第二篇文章”有标签['two']。

当我使用第二个查询时。 (query2)两个 =“我的第一个帖子”的输出有标签['two']。 ,“我的第二篇文章”有标签['two']。

  

我需要帖子中的所有标签。目前我只从帖子中获得一个标签。

2 个答案:

答案 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个请求中找到你想要的结果,因为你试图同时做两件事:

  1. 查找与特定Post
  2. 相关的所有Tag个实体
  3. 查找与找到的Tag实体
  4. 相关的所有Post个实体

    ......以及具有相同联接的所有内容,这似乎是完全不可能的。由于您要对要检索的Tag施加条件,因此唯一检索到的Tag实体将是满足该条件的实体,即具有您搜索名称的Tag

    你必须对同一个表进行多次连接才能使其工作,即便如此,我怀疑它会以你想要的方式工作。

    请记住,Doctrine的设计更易于使用,而非性能。在使用Doctrine IMHO时,试图以这种方式阻止低成本,单一额外请求会适得其反。

    知道这一点,我强烈建议您使用第一个解决方案。