Eloquent 在每个函数中使用 foreach

Eloquent using foreach inside each function

我想交换图像顺序(从 angularjs/ui-sortable 检索到的数据,因此 $newImgOrder 数组代表新顺序。)

(array) $newImgOrder = ['test.jpeg', 'another.jpeg'];

Images::select('url')->where('project_id', '=', $args['id'])->get()
   ->each(function($img) use (&$newImgOrder) {
       foreach ($newImgOrder as $item) {
           $img->url = $item;
           $img->save(); 
       }
   });

* 已更新 = 执行此操作的正确方法 *

感谢@Devon

移除 foreach + select()

(array) $newImgOrder = ['test.jpeg', 'another.jpeg'];

Images::where('project_id', '=', $args['id'])->get()
   ->each(function($img) use (&$newImgOrder) {
           $img->url = array_shift($item);
           $img->save(); 
       }
   });

这是我想做的事情的快速演示:

Table 动作前状态

+---------+-------------+--------------+
| id      | project_id  | url          |  
+---------+-------------+--------------+
| 1       | 15          | another.jpeg |
+---------+-------------+--------------+
| 2       | 15          | test.jpeg    |
+---------+-------------+--------------+

预期结果=

+---------+-------------+--------------+
| id      | project_id  | url          |  
+---------+-------------+--------------+
| 1       | 15          | test.jpeg    |
+---------+-------------+--------------+
| 2       | 15          | another.jpeg |
+---------+-------------+--------------+

实际结果=

+---------+-------------+--------------+
| id      | project_id  | url          |  
+---------+-------------+--------------+
| 1       | 15          | another.jpeg |
+---------+-------------+--------------+
| 2       | 15          | another.jpeg |
+---------+-------------+--------------+

那次迭代有什么问题。我尝试使用 double foreach 但我得到了相同的结果......我错过了什么吗?任何帮助将不胜感激。谢谢。

对于每张图片,您的代码循环遍历 $newImageOrder 并为该图片保存 url。因此,您要为每个图像执行两次保存,这显然不是您想要的。

内部foreach循环没有原因。如果您确定 $newImageOrder 中的元素数量将与查询中的行数匹配,并且由于您将 $newImageOrder 作为对闭包的引用传递,您可以使用 shift:

each(function($img) use (&$newImgOrder) {
   $img->url = array_shift($newImgOrder);
   $img->save();
});

这会将数组的第一个元素移出 return,这意味着您将在每次迭代中删除并使用 $newImgOrder 的第一个元素。

请记住,这是一个可变的变化。 $newImgOrder 被闭包改变了。如果这不是您想要的,您可能需要使用 运行 计数作为偏移量。