【问题标题】:Update fields from an array with CakePHP使用 CakePHP 更新数组中的字段
【发布时间】:2011-06-09 17:17:19
【问题描述】:

我有一个发送到我的控制器的数组,例如:

$array = array(
        [0]=>array(
             [id]=>5,
             [position]=>6 
        ),
       [1]=>array(
             [id]=>8,
             [position]=>2 
        )
);

我需要使用它的 id 保存每个项目的位置。在 cakePHP 中执行此操作的最佳方法是什么?我只能想象循环更新函数或拉取整个数据库,更改正确的值,然后保存数据库。这两个想法似乎都非常可靠。

【问题讨论】:

    标签: php cakephp


    【解决方案1】:

    哈,蛋糕魔法又来了。你不必告诉 Cake 通过 id 保存它。 Cake 有一个很长很神奇的方法,但是又短又瘦的是 -

    如果您的数组包含一个“id”键,Cake 会假定它是表主键并生成一个 UPDATE 语句而不是 INSERT。看起来像这样:

    UPDATE table as Table SET Table.position = $position WHERE Table.id = $id;
    

    而且,如果你使用 saveAll() 而不是 save(),Cake 知道会为你迭代:

    $this->Model->saveAll($array);
    

    如果您的模型中有任何保存回调,例如 beforeSave(),您必须在调用 saveAll() 之前手动调用它们 - 它们只会在 save() 时自动触发,而不是 saveAll() 或 updateAll()。

    您需要在数组顶部加上模型的名称($array['Model'][0]、$array['Model'][1] 等)。如果您需要使用多个模型神奇地 saveAll(),您可以在数组顶部添加索引键,然后是模型名称 - 例如 $array[0]['Model1'], $array[0]['Model2']) 和 Cake 知道保存/更新每个索引批次中所有模型的关联数据。

    Cake 为你做所有的跑腿工作:

    http://book.cakephp.org/view/1031/Saving-Your-Data - 特别是 saveAll() 条目。

    • 编辑 - 并在您的阵列顶部加上您的型号名称?蛋糕也让这变得非常容易。查看 Cake 的内置 Set 库,满足您所有的数组/对象操作需求。

    http://book.cakephp.org/view/1487/Set

    【讨论】:

    • 实际上,保存所有采用 int 索引的数组,而不是模型名称,例如:$this->Article->saveAll($data['Article']);不是 $this->Article->saveAll($data);其中数组是 $data['Article'][n]['field]。问题中粘贴的数组 OP 是 saveAll 的正确格式,它记录在您粘贴的链接中,但您仍然弄错了
    • @dogmatic69-- 实际上,我都完全正确。 :) API 非常清楚 -> api.cakephp.org/class/model#method-ModelsaveAll - “要保存的记录数据。这可以是数字索引数组(用于保存相同类型的多个记录),也可以是由关联名称索引的数组。” API 条目 + 从我的实时应用程序中粘贴的经过编辑的代码示例用于说明 -> saveAll() 1 条记录 + 多个模型 完全按照 API 所说的那样工作 :) 不必费心粘贴 saveAll 的示例( ) -> 多个记录,1 个模型 因为 -> 不需要,OP 的代码显示了这一点。 :)
    • @dogmatic69-- 值得一提的是,在 OP 提出这个问题之前不久,我回答了 OP 的另一个密切相关的问题;第一个问题包括更多上下文和背景,并且 OP 的代码显示数组的结构有点不同,等等。我包括了有关 cake 的 save / saveAll、模型回调等的额外信息和示例,因为额外的背景表明 OP 会觉得很重-职责模型方法有用/相关。 stackoverflow.com/questions/6285006/…
    • 感谢您的回答,非常感谢您提供额外的细节。我不确定将正确答案授予谁,因为你们都链接到 saveAll 函数,这最终给了我正在寻找的解决方案。我给了戴夫正确的答案,因为我虽然他先回答了,但显然你有更详细和有用的回答。
    【解决方案2】:

    你试过 CakePHP 的 saveAll() 吗? Details here.

    【讨论】:

    • 我一直低估蛋糕的作用。当然,如果数据格式正确,cake 会照常处理……现在看起来很简单!
    猜你喜欢
    • 2013-01-22
    • 1970-01-01
    • 2020-08-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多