Это называется проблемой 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();
}
}
Где вы фактически запрашиваете все корзины внутри переменной как коллекцию, и вы просто манипулируете этой коллекцией локально, не касаясь базы данных (только когда вы нажимаете метод сохранения).