修改蛋糕关联结果数组

时间:2015-09-23 09:27:09

标签: php mysql cakephp associations cakephp-2.0

我遇到了修改蛋糕关联层次结构的问题,我是cakephp的新手,下面是代码片段。

当前代码

$this->Cateogory->find('all');

上述表达式的输出结果如下:

    [
      {
        "Category": {
          "id": "37",
          "title": "Inner Title",
          "color": "#ffffff",
          "phone-number": ""
        },
        "CategoryHas": [],
        "PhoneNumberhas": []
      }
    ]

要求: -

我正在为第三方消费创建API,现在第三方已经给出了如下输出格式。我希望输出的格式低于表格。

    [
      {
        "Category": {
          "id": "37",
          "title": "Inner Title",
          "color": "#ffffff",
          "phone-number": "",
          "CategoryHas": [],
          "PhoneNumberhas": []
        }
      }
    ]

我正在搜索这个问题过去1天,我认为我需要自定义PHP函数来解决问题。

提前致谢:

2 个答案:

答案 0 :(得分:0)

只需使用循环

要将第一种格式的数组转换为第二种格式的数组 - 只需使用循环,例如:

foreach ($stuff as &$row) {
        $row['Category']['CategoryHas'] = $row['CategoryHas'];
        $row['Category']['PhoneNumberhas'] = $row['PhoneNumberhas'];
        unset($row['CategoryHas'], $row['PhoneNumberhas']);
}

如果仅在一个地方需要它,那么放入你的控制器是合适的。

如果您总是希望以该格式获得结果,请使用afterFind方法(或行为)来实现相同的逻辑:

// In the category model
public function afterFind($results, $primary = false) {
    foreach ($results as &$row) {
        if (isset($row['CategoryHas'])) {
            $row['Category']['CategoryHas'] = $row['CategoryHas'];
        }
        if (isset($row['PhoneNumberhas'])) {
            $row['Category']['PhoneNumberhas'] = $row['PhoneNumberhas'];
        }
        unset($row['CategoryHas'], $row['PhoneNumberhas']);
    }
    return $results;
}

谨慎选择此选项 - 这意味着您的模型非常规地行事,可能意味着插件不起作用,而其他开发人员(或您明天)对模型的行为方式感到困惑。

答案 1 :(得分:-1)

您的关联名称非常奇怪。他们为什么不能更好地命名?您可以在内部使用专有名称,并在发送时重新格式化。

如果这只是将API响应变为无法提供额外好处的愚蠢格式,请使用JSON视图并根据需要更改视图中数组的结构。 This section of the book详细解释,阅读。摘自本书的例子:

// Controller code
class CategoriesController extends AppController {
    public function index() {
        // ... get the categories
        $this->set(compact('categories'));
    }
}

// View code - app/View/Posts/json/index.ctp
foreach ($categories &$row) {
    if (isset($row['CategoryHas'])) {
        $row['Category']['CategoryHas'] = $row['CategoryHas'];
    }
    if (isset($row['PhoneNumberhas'])) {
        $row['Category']['PhoneNumberhas'] = $row['PhoneNumberhas'];
    }
    unset($row['CategoryHas'], $row['PhoneNumberhas']);
}
echo json_encode(compact('categories'));

我会说服客户并为适当的响应格式和结构带来一些论据。大多数客户通常不知道他们想要什么。有时你会有聪明的驴子认为他们需要特定的东西,但可以解释原因。检查JSendhttp://jsonapi.org/,了解如何实施正确的API响应格式。了解这些格式的原因并将这些参数提交给客户。