Вложенный цикл вызвал снижение производительности - PullRequest
0 голосов
/ 24 мая 2018
foreach ($id_prs as $ids) {
   list($id_pr, $id_cart) = explode('-', $ids);
    foreach ($id_cart as $id) {
        $r = Cart::find($id);
                /// column to update value
                $r->save();
    }
}

Вот так выглядит мой цикл.

Например, $ id_prs состоит из 10 данных, в то время как каждый id_prs может состоять из 20 данных и т. Д.

Оттуда я нашелцикл занимает больше времени при большом количестве данных из каждой $ id_cart.

Как я могу решить проблему с производительностью, есть ли решение?

Ответы [ 3 ]

0 голосов
/ 24 мая 2018

Ваш код и переменные недостаточно понятны.Но лучшее решение:

foreach ($id_prs as $ids) {
   list($id_pr, $id_cart) = explode('-', $ids);
   $items = Cart::whereIn('id', $id_cart) -> get();

   foreach($items as $item) {
       Cart::where('id', $item -> id) -> limit(1) -> update([
           // Columns to update
       ]);
   }
}
0 голосов
/ 24 мая 2018

Если вы хотите обновить одно и то же значение для всех записей

$allIds = [];
foreach ($id_prs as $ids) {
   list($id_pr, $id_cart) = explode('-', $ids);
    foreach ($id_cart as $id) {
        $allIds[] = $id;
    }
}
$cart = Cart::whereIn('id',$allIds)->update(['columns'=>'value']);
0 голосов
/ 24 мая 2018

Это называется проблемой n + 1, каждый раз, когда вы выполняете итерацию внутри каждого foreach, создается дополнительный запрос.

Таким образом, эта строка является злой, потому что она запрашивает данные каждую итерацию.

$r = Cart::find($id);

Вы можете сделать это лучше так:

$cart = Cart::all();
foreach ($id_prs as $ids) {
   list($id_pr, $id_cart) = explode('-', $ids);
    foreach ($id_cart as $id) {
        // Get it from collection rather than query it from database
        $cart->where('id', $id)->first()->save();
    }
}

Где вы фактически запрашиваете все корзины внутри переменной как коллекцию, и вы просто манипулируете этой коллекцией локально, не касаясь базы данных (только когда вы нажимаете метод сохранения).

...