Удаление модели внутри цикла for приводит к ошибочному увеличению

#php #mysql #laravel

#php #mysql #laravel

Вопрос:

Я делаю это в своем контроллере:

     $latestRevision = DB::table('revisions')->latest('created_at')->first();
    $firstRevision = DB::table('revisions')->find($id);
    $revisions = DB::table('revisions')->whereBetween('created_at', [$firstRevision->created_at, $latestRevision->created_at])->get();
    for ($i=0; $i < count($revisions); $i  ) { 
        Property::find($revisions[$i]->revisionable_id)->update([$revisions[$i]->key => $revisions[$i]->old_value]);
        DB::table('revisions')->whereId($revisions[$i]->id)->delete();
    }
 

Что заставляет Laravel генерировать сотни новых таблиц, это потому, что я удаляю модель, которая также вызывается в цикле for в качестве параметра?

Как я могу удалить эти таблицы один раз, а не снова и снова? Но только количество (10)

Пример:

Я начинаю с 30 ревизий, но этот foreach возвращает 187:

         $latestRevision = DB::table('revisions')->latest('created_at')->first();
        $firstRevision = DB::table('revisions')->find($id);
        $revisions = DB::table('revisions')->whereBetween('created_at', [$firstRevision->created_at, $latestRevision->created_at])->get();
        $arr = [];
        foreach ($revisions as $key => $value) {
            array_push($arr, $value);
        }
 

Комментарии:

1. вы имели в виду, что вы удаляете эту ревизию только между заданной датой

2. Да, это должен быть цикл foreach извините за это

Ответ №1:

Вы можете использовать limit() . Этот метод вернет только первые x строк вашего запроса. Попробуйте это:

  $revisions = DB::table('revisions')->whereBetween('created_at', [$firstRevision->created_at, $latestRevision->created_at])->limit(10)->get();
 

Комментарии:

1. Спасибо! Но подсчет был просто примером от меня, чтобы прояснить, что я хочу, чтобы модели внутри цикла foreach удалялись только один раз, а не повторно