用Cakephp中的相关数据替换外键

时间:2014-12-17 21:36:51

标签: php cakephp

我有一个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'
        }
    }
}

3 个答案:

答案 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];
    }

}