gpt4 book ai didi

php - CakePHP 3 : Changing structure of result set

转载 作者:可可西里 更新时间:2023-10-31 22:52:41 26 4
gpt4 key购买 nike

我是 CakePHP 新手,遇到以下问题:

我有表“图片”、“关键字”和“关键字类别”。每个图像都可以有多个关键字(多对多),每个关键字都有一个类别(多对一)。使用

检索图像列表
$images = $this->Images->find()->contain(['Keywords',  'Keywords.KeywordCategories']);

返回这样的结果结构:

[
{
"id":1,
"keywords":[
{
"keyword":"Dog",
"keyword_category":{
"title":"Animal"
}
},
{
"keyword":"Cat",
"keyword_category":{
"title":"Animal"
}
},
{
"keyword":"Black",
"keyword_category":{
"title":"Color"
}
}
]
}
]

这很好,但我希望关键字按其关键字类别按如下结构分组:

[
{
"id":1,
"keyword_categories":[
{
"title":"Animal",
"keywords":[
{
"keyword":"Dog"
},
{
"keyword":"Cat"
}
]
},
{
"title":"Color",
"keywords":[
{
"keyword":"Black"
}
]
}
]
}
]

知道如何使用 CakePHP 查询实现这一点吗?

最佳答案

该格式几乎是一个反向包含,仅使用 ORM 关联自动魔术是不可能的。您将不得不单独获取关联数据,对其进行过滤并将其注入(inject)图像结果中……您甚至可以创建一个自定义关联类来包含、获取并将结果拼接在一起,但如果您问,那有点矫枉过正我。

因为无论如何你都必须做一些额外的格式化(并且只是为了将结果拼接在一起),我会简单地使用一些集合格式化 foo 来代替,类似于

// ...
->find()
->contain(['Keywords', 'Keywords.KeywordCategories'])
->formatResults(function ($results) {
/* @var $results \Cake\Datasource\ResultSetInterface|\Cake\Collection\CollectionInterface */
return $results->map(
function ($image) {
$image['keyword_categories'] =
collection($image['keywords'])
->groupBy('keyword_category.title')
->map(function ($keywords, $category) {
foreach ($keywords as &$keyword) {
unset($keyword['keyword_category']);
}
return [
'title' => $category,
'keywords' => $keywords
];
})
->toList();
unset($image['keywords']);
return $image;
}
);
});

* 用于说明目的的未经测试的示例代码

即在每个图像结果上创建一个名为 keyword_categories 的计算字段,由包含的关键字组成,按其相关类别标题分组,关键字嵌套在带有 title 的数组中> 和 keywords 字段,其中类别从关键字中删除,最后将整个内容重新索引为基本的数字索引数组。

另见

关于php - CakePHP 3 : Changing structure of result set,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34839556/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com