使用 Doctrine Extensions Tree Nested 集在父母中获取孩子的帖子

Posted

技术标签:

【中文标题】使用 Doctrine Extensions Tree Nested 集在父母中获取孩子的帖子【英文标题】:Get children's posts in parents with Doctrine Extensions Tree Nested set 【发布时间】: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;

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

【问题讨论】:

【参考方案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);

【讨论】:

以上是关于使用 Doctrine Extensions Tree Nested 集在父母中获取孩子的帖子的主要内容,如果未能解决你的问题,请参考以下文章

Symfony 2 蛞蝓空

使用 Doctrine 保存行时出现 Doctrine_Connection_Mysql_Exception

PHP-Doctrine2: Items - Shops - ItemsAtShops - 如何使用Doctrine2方便地实现?

Doctrine 2.0 结果集映射使用不正确?

如何使用 Doctrine DBAL?

PHP 将Zend Framework 1.10与Doctrine 2集成(使用Doctrine的Autoloader)