【问题标题】:Eloquent save() method not working inside for loop雄辩的 save() 方法在 for 循环中不起作用
【发布时间】:2019-04-27 10:57:37
【问题描述】:

我有一个如下所示的表格,该表格将用于项目图像。

id:主键

project_id:与项目相关的列。

order_num:表示特定项目的图像列表顺序(例如项目的内部视图,施工项目的外部视图,不同的方面等......)

+---------+-------------+-----------+
| id      | project_id  | order_num |  
+---------+-------------+-----------+
| 1       | 15          | 0         |
+---------+-------------+-----------+
| 2       | 15          | 0         |
+---------+-------------+-----------+
| 3       | 16          | 0         |
+---------+-------------+-----------+
| 4       | 16          | 0         |
+---------+-------------+-----------+
| 5       | 16          | 0         |
+---------+-------------+-----------+
                 .
                 .
                 .   

         GOES ON LIKE THIS


What i want to do:

+---------+-------------+-----------+
| id      | project_id  | order_num |  
+---------+-------------+-----------+
| 1       | 15          | 1         |
+---------+-------------+-----------+
| 2       | 15          | 2         |
+---------+-------------+-----------+
| 3       | 16          | 1         |
+---------+-------------+-----------+
| 4       | 16          | 2         |
+---------+-------------+-----------+
| 5       | 16          | 3         |
+---------+-------------+-----------+

我使用 Slim 和 Eloquent

我想出了类似的方法,但是我得到了 save() 方法的 bad method 错误。

$find = Images::where('project_id', '=', $project->id)->count();

$img = Images::where('project_id', '=', $project->id);

for ($i = 1; $i <= $find; $i++) {
     $img->order_num = $i;
     $img->save();
}

我做错了吗?任何帮助将不胜感激。

更新 [!!] 两个答案都给出了正确的结果,但根据 odan 的信息,apokryfos 的答案是干净的代码。感谢您的所有帮助。

【问题讨论】:

  • 是order_num还是order_id需要改?
  • 啊抱歉写错了,但问题不存在
  • 请使用查询生成器,而不是这个 Active Record 反模式。
  • @odan hi,odan,你的意思是下面给出的 each() 函数?
  • @bgul 是的,在这种情况下,循环更新多条记录是一种真正的反模式。

标签: php laravel eloquent slim


【解决方案1】:

试试这个

$imgs = Images::where('project_id', '=', $project->id)->get();
foreach($imgs as $i => $img) {
    $img->order_id = $i + 1;
    $img->save();
}

【讨论】:

  • 非常感谢您的回答。我认为问题是由 for 循环引起的......但这一个完美无缺。再次感谢。
  • 你可能需要做$img = Images::where('project_id', '=', $project-&gt;id)-&gt;get()-&gt;values()。收集结果有可能由 id 键入。
  • 没有值()也能正常工作。但我会记住这一点,感谢您分享知识。 :)
【解决方案2】:

$img 似乎是一个查询构建器对象。

如果您执行$img = Images::where('project_id', '=', $project-&gt;id)-&gt;get();,您将获得所有需要更新的示例:

 $index = 1;
 Images::where('project_id', '=', $project->id)->get()
        ->each(function ($img) use (&$index) {
              $img->order_num = $index++;
              $img->save();
         });

这将更新单个项目 ID 的所有图像索引。如果你想做所有这些,那么你可以这样做:

 $index = 0;
 $lastProjectId = null;
 Images::orderBy('project_id')->get()
        ->each(function ($img) use (&$index, $lastProjectId) {
              if ($lastProjectId == null) {
                 $lastProjectId = $img->project_id; 
              }   
              if ($img->project_id != $lastProjectId) {
                 $index = 1;
                 $lastProjectId = $img->project_id;
              }
              $img->order_num = $index++;
              $img->save();
         });

【讨论】:

  • 感谢您的帮助@apokryfos。我还没有听说过 each() 方法(我必须对此进行一些研究)。感谢您提供用于升级所有值的附加代码
猜你喜欢
  • 1970-01-01
  • 2016-06-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-26
  • 2023-04-07
相关资源
最近更新 更多