删除父更新中的一个集合

时间:2015-01-27 21:16:53

标签: php laravel refactoring

我正在尝试在更新时删除(或创建)模型关联对象。每个酒吧都有几个水龙头。创建条形图时,会创建这些水龙头对象,您可以更新该编号,并根据需要创建或删除其他水龙头。

最初我只想这样使用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();
            }
        }

这似乎不是写这个的最简单方法。有没有更好的方法来写这个?

顺便说一句,对于那些想知道的人来说,这是我控制器中的更新功能。

2 个答案:

答案 0 :(得分:1)

这应该可行不幸的是,这不起作用,因为DELETE语句不支持偏移。

Beertap::where('bar_id')->skip($taps_new)->delete();

因此它会跳过你想要保留的多个水龙头并删除其余的水龙头。如果哪个行被删除,您可能需要使用orderBy

更新

这应该完全奏效。首先从集合中删除要删除的所有ID,然后使用一个查询

删除它们
$idsToDelete = $taps->slice($taps_new)->modelKeys();
Beertap::destroy($idsToDelete);

更新2

您也可以优化创建过程(以便在单个查询中完成)

$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();