如何在CakePHP3.0中构建这个复杂的数据库查询?

如何在CakePHP3.0中构建这个复杂的数据库查询?,cakephp,Cakephp,这是我的数据库设计,或者至少是与这个问题相关的表 我想构建一个查询,返回一个页面(find将基于path属性),其中包含关联的容器,以及线程形式的关联子容器,并且所有这些容器都应该单独具有关联的块(最好按照blocks_pages表格中的index列的正确顺序排序) 有谁能给我一个如何用查询生成器包装这些内容的线索吗?或者如果不可能,那么是否可以使用新的map/reduce功能来完成,因为after find函数已经被删除了 如果它有帮助,这将是可视化的结果,如果你只是忽略洋红的文章框一会儿。

这是我的数据库设计,或者至少是与这个问题相关的表

我想构建一个查询,返回一个页面(find将基于
path
属性),其中包含关联的容器,以及线程形式的关联子容器,并且所有这些容器都应该单独具有关联的块(最好按照blocks_pages表格中的
index
列的正确顺序排序)

有谁能给我一个如何用查询生成器包装这些内容的线索吗?或者如果不可能,那么是否可以使用新的map/reduce功能来完成,因为after find函数已经被删除了

如果它有帮助,这将是可视化的结果,如果你只是忽略洋红的文章框一会儿。 试试这个

$pagesTable
  ->find()
  ->where(['path' => $myPath])
  ->contain([
   'Containers.ChildContainers' => function($q) {
      return $q->formatResults(function($results) {
        return $results->map(function($container) {
            $container->nested = $container->source()
              ->find('children', ['for' => $container->id])
              ->find('threaded')
              ->contain(['Blocks']);
            return $container;
        });
      });
   },
   'Containers.ChildContainers.Blocks'
  ])

编辑,我给了你“接受的答案”检查,但我收回了它,因为还有一件事出了问题。现在我还得到了连接到不同页面的块。你看,几个页面可以使用相同的容器,所以当代码从ChildContainers获得关联的块时,它还应该检查BlocksPages表中的页面id是否匹配当前页面。你知道如何放入该检查吗?现在我使用修复了该问题。如果你知道一种更干净的方法,那么我洗耳恭听。不,我不认为它能比这更好。如果你仔细想想,你用一条语句就取得了很多成就。你可以在另一条语句中将回调分解为自定义查找程序在Pages表中作为可选项或受保护的函数。这将提高可读性