我正在尝试在更新时删除(或创建)模型关联对象。每个酒吧都有几个水龙头。创建条形图时,会创建这些水龙头对象,您可以更新该编号,并根据需要创建或删除其他水龙头。
最初我只想这样使用pop
:
$taps=$bar->taps;
if ( $taps_old < $taps_new){
for ($i = $taps_old; $i < $taps_new; $i++) {
$tap = Growlertap::create(['growlerstation_id' => $id]);
}
}
elseif ($taps_old > $taps_new) {
for ($i = $taps_new; $i < $taps_old; $i++) {
$taps->pop();
}
哪个不起作用但不会给我一个错误。我知道if语句工作正常,因为下面的代码可以工作:
elseif ($taps_old > $taps_new) {
for ($i = $taps_new; $i < $taps_old; $i++) {
Beertap::where('bar_id', '=', $id)->first()->delete();
}
}
这似乎不是写这个的最简单方法。有没有更好的方法来写这个?
顺便说一句,对于那些想知道的人来说,这是我控制器中的更新功能。
答案 0 :(得分:1)
这应该可行不幸的是,这不起作用,因为DELETE语句不支持偏移。
Beertap::where('bar_id')->skip($taps_new)->delete();
因此它会跳过你想要保留的多个水龙头并删除其余的水龙头。如果哪个行被删除,您可能需要使用orderBy
。
这应该完全奏效。首先从集合中删除要删除的所有ID,然后使用一个查询
删除它们$idsToDelete = $taps->slice($taps_new)->modelKeys();
Beertap::destroy($idsToDelete);
您也可以优化创建过程(以便在单个查询中完成)
$data = [];
for ($i = $taps_old; $i < $taps_new; $i++) {
$data[] = ['growlerstation_id' => $id];
}
Beertap::insert($data);
注意在选择使用insert()
时,您将失去自动时间戳和模型事件等Eloquent功能。
答案 1 :(得分:1)
pop()
将删除本地收藏中的最后一项,但不会将该更改保留在数据库中。
假设它是一个Beertap
对象,这样的东西应该有效:
警告:未经测试的代码
...
elseif ($taps_old > $taps_new) {
for ($i = $taps_new; $i < $taps_old; $i++) {
$delete_me = $taps->pop();
$delete_me->delete();
}
}
或更简洁:$taps->pop()->delete();