如何在CakePHP3.0中构建这个复杂的数据库查询?
这是我的数据库设计,或者至少是与这个问题相关的表 我想构建一个查询,返回一个页面(find将基于如何在CakePHP3.0中构建这个复杂的数据库查询?,cakephp,Cakephp,这是我的数据库设计,或者至少是与这个问题相关的表 我想构建一个查询,返回一个页面(find将基于path属性),其中包含关联的容器,以及线程形式的关联子容器,并且所有这些容器都应该单独具有关联的块(最好按照blocks_pages表格中的index列的正确顺序排序) 有谁能给我一个如何用查询生成器包装这些内容的线索吗?或者如果不可能,那么是否可以使用新的map/reduce功能来完成,因为after 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表中作为可选项或受保护的函数。这将提高可读性