【问题标题】:Get children's posts in parents with Doctrine Extensions Tree Nested set使用 Doctrine Extensions Tree Nested 集在父母中获取孩子的帖子
【发布时间】:2015-08-21 23:10:16
【问题描述】:

我在 Symfony2 中使用 nested set 行为和 StofDoctrineExtension

类别和帖子模型配置良好,类别树工作正常。

为了显示某个类别的帖子,我使用我的存储库中的这个查询:

public function findAllPosts($category)
{
    return $this->queryAllPosts($category)->getResult();
}

public function queryAllPosts($category)
{
    $em = $this->getEntityManager();

    $query = $em->createQuery('
        SELECT p, c FROM AppBundle:Post p JOIN p.category c
        WHERE c.slug = :category
        ORDER BY p.created DESC
    ');

    $query->setParameter('category', $category);

    return $query;
}

但是我怎么能也显示这些类别的孩子的帖子呢?

【问题讨论】:

    标签: php symfony doctrine-orm doctrine-query


    【解决方案1】:

    如果你的 CategoryRepository 继承自 NestedTreeRepository 你可以这样做:

    $categories = $em->getRepository('XBundle:Category')
      ->childrenQueryBuilder($category)
      ->addSelect('posts')
      ->join('node.posts', 'posts')
      ->getQuery()
      ->getResult();
    
    foreach ($categories as $category) {
      $category->getPosts();
      // do stuff
    }
    

    【讨论】:

      【解决方案2】:

      您应该能够在一个接近这个查询的查询中执行此操作,因为我不是专业 SQL,它通常需要我时间和测试才能正确完成,但这是我要开始的地方:

       SELECT parent.* , children.* FROM 
                (SELECT p, c FROM AppBundle:Post p JOIN p.category c WHERE c.slug = :category) AS parent 
                INNER JOIN 
                (SELECT p1 FROM  AppBundle:Post p1 JOIN p.category c1 ON c1.parent = parent.id ) AS children 
      

      不确定您是否需要在内部选择或包装器选择中执行 ON 连接,但您可以尝试 :)

      【讨论】:

      • 它给出了 '(' 的语义错误。我将继续尝试使用 SQL 的不同解决方案,至少现在我可以专注于那里。谢谢!
      • 我知道它会给出某种错误哈哈,但这是子查询比使用循环更好的方式。
      【解决方案3】:

      我找到了路。查询将是这样的:

      /*
       * GET POSTS FROM PARENT AND CHILDREN
       */
      public function getPostsParentAndChildren($children)
      {
          $em = $this->getEntityManager();
      
          $posts = $em->createQueryBuilder()
              ->select(array('p', 'c'))
              ->from('AppBundle:Post', 'p')
              ->join('p.category', 'c')
              ->where('c.id IN (:children)')
              ->orderBy('p.created', 'DESC')
              ->getQuery();
      
          $posts->setParameter('children', $children);
      
          return $posts->getResult();
      }
      

      我们将一个包含子项的数组传递给查询,我们使用函数 getChildren($categoryId) 获得该数组。请记住,您必须传递 id(使用此查询),因此您可以获得这样的 id:

          $category = $repo->findOneBy(array('slug' => $slug1));
      
          $children = $repo->getChildren($category);
      
          $childrenIds[] = $category->getId();
          foreach ($children as $child){
              $id = $child->getId();
              $childrenIds[] = $id;
          }
      
          $posts = $em->getRepository('AppBundle:Category')->getPostsParentAndChildren($childrenIds);
      

      【讨论】:

        猜你喜欢
        • 2016-09-21
        • 2021-11-09
        • 1970-01-01
        • 1970-01-01
        • 2018-01-29
        • 2016-10-06
        • 2013-06-04
        • 1970-01-01
        • 2021-12-02
        相关资源
        最近更新 更多