Eloquent save() 方法在 for 循环中不起作用
Eloquent save() method not working inside for loop
我有一个 table 如下所示,这个 table 将用于项目图像。
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() 方法的错误。
$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 的答案是干净的代码。谢谢大家的帮助。
试试这个
$imgs = Images::where('project_id', '=', $project->id)->get();
foreach($imgs as $i => $img) {
$img->order_id = $i + 1;
$img->save();
}
$img
似乎是一个查询生成器对象。
如果你这样做 $img = Images::where('project_id', '=', $project->id)->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();
});
我有一个 table 如下所示,这个 table 将用于项目图像。
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() 方法的错误。
$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 的答案是干净的代码。谢谢大家的帮助。
试试这个
$imgs = Images::where('project_id', '=', $project->id)->get();
foreach($imgs as $i => $img) {
$img->order_id = $i + 1;
$img->save();
}
$img
似乎是一个查询生成器对象。
如果你这样做 $img = Images::where('project_id', '=', $project->id)->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();
});