修改蛋糕关联结果数组

Posted

技术标签:

【中文标题】修改蛋糕关联结果数组【英文标题】:Modify cake association result array 【发布时间】:2015-09-23 09:27:08 【问题描述】:

我在修改蛋糕关联层次结构时遇到问题,我是 cakephp 新手,下面是代码的 sn-p。

当前代码

$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 函数来解决这个问题。

提前致谢:

【问题讨论】:

请不要在没有评论的情况下投反对票!! 好吧,我正在创建 API 供第 3 方使用,他们已经指定了响应格式。因此寻找蛋糕的方式来获得这种格式 @sanjeev 我会更新你的问题,说明希望结构改变的原因,以便更清楚。 【参考方案1】:

只需使用循环

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

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;

谨慎选择此选项 - 这意味着您的模型行为非常规,这可能意味着插件无法正常工作,并且其他开发人员(或者您,明天)对模型的行为方式感到困惑。

【讨论】:

此解决方案每次都会更改结果集,即使在不需要时也会更改数据结构,甚至会在内部更改数据结构,而不仅仅是针对外部 API。在通过关联使用模型时,不使用别名也会导致此中断。 @burzum 很高兴看到您阅读了答案(您似乎完全跳过了所有单词)。【参考方案2】:

你的协会名称很奇怪。为什么他们没有更好的名字?您可以在内部使用专有名称并在发送时重新格式化。

如果这只是将 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 响应格式。了解这些格式的原因并将这些论据带给客户。

【讨论】:

而我因为什么原因被否决了...?恕我直言,该解决方案甚至比 AD7six 更好,它每次都会更改结果集,即使在不需要时也会更改数据结构,甚至会在内部更改数据结构,而不仅仅是针对外部 API。另外,我提供了一些关于如何构建正确的 API 响应格式的额外信息。 我对您过于居高临下/咄咄逼人的回答投了反对票 - 我已经厌倦了多年来的评论来告诉您这一点,因为您似乎没有倾听/学习。奇怪的是,您的答案现在包含我的副本,与您在我的答案中评论的相同(有争议的)缺陷。无需将 isset 调用放入您可以假设键存在的代码中,它们会在特定的视图模板中。 这不是副本,我只是从您的答案中添加了数据转换的部分并将其放在恕我直言的正确位置并更改了示例 来自 cakephp 书以匹配他有什么。这不是一个完全不同的答案和方法。随意讨论我将其置于 json 视图中的原因。他的主要问题似乎是改变数组的结构,看起来他也想要复制和粘贴准备好的代码。如果你不喜欢我,请忽略我,谢谢。 :)

以上是关于修改蛋糕关联结果数组的主要内容,如果未能解决你的问题,请参考以下文章

HABTM 蛋糕 php 查找

数据结构与算法之深入解析“切割后面积最大的蛋糕”的求解思路与算法示例

保存蛋糕时如何得到错误?

[NOI1999] 生日蛋糕

ZJNU 2226 - B.T.B.F

香蕉蛋糕