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 被闭包改变了。如果这不是您想要的,您可能需要使用 运行 计数作为偏移量。
我想交换图像顺序(从 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 被闭包改变了。如果这不是您想要的,您可能需要使用 运行 计数作为偏移量。