chr*_*sch 4 php cakephp cakephp-3.x
我是CakePHP的新手,有以下问题:
我有"图像","关键字"和"KeywordCategories"表.每个图像都可以有许多关键字(多对多),每个关键字都有一个类别(多对一).使用检索图像列表
$images = $this->Images->find()->contain(['Keywords', 'Keywords.KeywordCategories']);
Run Code Online (Sandbox Code Playgroud)
返回如下结果结构:
[
{
"id":1,
"keywords":[
{
"keyword":"Dog",
"keyword_category":{
"title":"Animal"
}
},
{
"keyword":"Cat",
"keyword_category":{
"title":"Animal"
}
},
{
"keyword":"Black",
"keyword_category":{
"title":"Color"
}
}
]
}
]
Run Code Online (Sandbox Code Playgroud)
这没关系,但我想在这样的结构中按关键字类别对关键字进行分组:
[
{
"id":1,
"keyword_categories":[
{
"title":"Animal",
"keywords":[
{
"keyword":"Dog"
},
{
"keyword":"Cat"
}
]
},
{
"title":"Color",
"keywords":[
{
"keyword":"Black"
}
]
}
]
}
]
Run Code Online (Sandbox Code Playgroud)
知道如何通过CakePHP查询实现这一目标吗?
这种格式几乎是反向包含,仅使用ORMs关联自动魔法是不可能的.您必须单独获取关联的数据,过滤它,并将其注入图像结果...您甚至可以创建一个自定义关联类,包含,提取和拼接结果,但如果你问的话,那就太过分了我.
因为你不得不做一些额外的格式化(并且只是为了将结果拼接在一起),我只是简单地使用一些集合格式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;
}
);
});
Run Code Online (Sandbox Code Playgroud)
*用于说明目的的未经测试的示例代码
即创建名为计算的字段keyword_categories上的每个图像的结果,由包含关键字,通过其相关联的类别的标题分组的,与嵌套在与阵列的关键字title和keywords字段,其中类别被从关键字取出,最后重新索引整个事物作为一个基本的数字索引数组.
也可以看看
| 归档时间: |
|
| 查看次数: |
1081 次 |
| 最近记录: |