我有一个Cakephp应用程序,它使用包含允许我轻松获取相关数据。现在这很好用,并且可以下载我正在寻找的所有数据。问题是它创建了主模型的兄弟,而不是在里面嵌套相关数据。我在下面列出了当前查询返回的内容与我想要返回的内容。
当前时间:
{
'Product' :
{
'id':321
'name':'product name'
'store_id':123
},
'Store' :
{
'id':123
'name':'store name'
}
}
Ex of of desired:
{
'Product' :
{
'id':321
'name':'product name'
'store': {
'id':123,
'name':'store name'
}
}
}
答案 0 :(得分:0)
您可以使用CakePHP的afterFind模型方法:
class Product extends AppModel{
function afterFind($results,$primaryKey){
unset($results['Product']['store_id']);
$results['Product']['store'] = $results['Store'];
return $results;
}
}
请注意,传递给方法的$results
参数是find
默认返回的数组,我们在afterFind
方法中返回的数组是数组find
将返回...
答案 1 :(得分:0)
在这种情况下,afterFind()
回调不是一个好主意,除非您希望在所有时间和每个地方修改结果。此外,您还需要在更改结构之前检查关联的模型数据是否可用。
阅读以下两个链接:
序列化您的视图变量并使用json视图并根据需要更改数据。
从书中取得的例子:
// Controller code
class PostsController extends AppController {
public function index() {
$this->set(compact('posts', 'comments'));
}
}
// View code - app/View/Posts/json/index.ctp
foreach ($posts as &$post) {
unset($post['Post']['generated_html']);
// MODIFY YOUR DATA HERE AS NEEDED
}
echo json_encode(compact('posts', 'comments'));
不要忘记设置扩展路由并使用RequestHandlerComponent。阅读我提供的链接,他们会很好地解释。
答案 2 :(得分:0)
我最终创建了自己的助手,它足够通用,可用于所有类型的数据。这将搜索主要结果并查找_id键,然后查找匹配该ID以进行组合的模型。
<?php
App::uses('AppHelper', 'View/Helper');
class DataMapperHelper extends AppHelper {
public function combineMultipleResults($dataArray) {
return Hash::map($dataArray, "{n}", array($this, 'combineResults'));
}
public function combineResults($dataArray) {
reset($dataArray);
$primaryKey = key($dataArray);
foreach ($dataArray[$primaryKey] as $key => $value) {
if(preg_match("/[a-zA-Z]+_id/", $key) == 1) {
$newKey = str_replace("_id", "", $key);
$linkedDataKey = ucfirst($newKey);
$dataArray[$primaryKey][$newKey] = $dataArray[$linkedDataKey];
unset($dataArray[$primaryKey][$key]);
unset($dataArray[$linkedDataKey]);
}
}
return $dataArray[$primaryKey];
}
}