我遇到了修改蛋糕关联层次结构的问题,我是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函数来解决问题。
提前致谢:
答案 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'));
我会说服客户并为适当的响应格式和结构带来一些论据。大多数客户通常不知道他们想要什么。有时你会有聪明的驴子认为他们需要特定的东西,但可以解释原因。检查JSend或http://jsonapi.org/,了解如何实施正确的API响应格式。了解这些格式的原因并将这些参数提交给客户。