我想交换图像订单(从angularjs / ui-sortable检索到的数据,因此$ newImgOrder数组表示新订单。)
<div class="container">
<div class="title">Header</div>
<div class="content">Content</>
</div>
.container {
display: grid;
height: 100%; /* 100vh creates not desired sroll and extra space*/
grid-template-rows: 34px 1fr;
grid-template-areas:
"header"
"main"
}
.title {
grid-area: header;
line-height: 34px;
vertical-align: middle;
padding-left: 10px;
background-color: orange;
}
.content {
grid-area: main;
background-color: yellow;
}
感谢@Devon
已删除foreach + select()
(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();
}
});
以下是我想做什么的快速演示:
操作前的表格状态
(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();
}
});
预期结果=
+---------+-------------+--------------+
| id | project_id | url |
+---------+-------------+--------------+
| 1 | 15 | another.jpeg |
+---------+-------------+--------------+
| 2 | 15 | test.jpeg |
+---------+-------------+--------------+
实际结果=
+---------+-------------+--------------+
| id | project_id | url |
+---------+-------------+--------------+
| 1 | 15 | test.jpeg |
+---------+-------------+--------------+
| 2 | 15 | another.jpeg |
+---------+-------------+--------------+
该迭代有什么问题。我尝试使用double foreach,但结果却相同...我错过了什么吗?任何帮助将不胜感激。谢谢。
答案 0 :(得分:0)
对于每个图像,您的代码将循环$ newImageOrder并保存该图像的url。因此,您将为每个图像执行两次保存,这显然不是您想要的。
没有理由进行内部foreach循环。如果您确定$ newImageOrder中的元素数将与查询中的行数匹配,并且由于要传递$ newImageOrder作为对闭包的引用,则可以使用shift:
each(function($img) use (&$newImgOrder) {
$img->url = array_shift($newImgOrder);
$img->save();
});
这会将第一个元素移出数组并返回它,这意味着您将在每次迭代中删除并使用$ newImgOrder的第一个元素。
请记住,这是一个可变的更改。 $ newImgOrder被闭包修改。如果这不是您想要的,则可能需要使用运行计数作为偏移量。