Красноречивое использование foreach внутри каждой функции - PullRequest
0 голосов
/ 29 ноября 2018

Я хочу обменять порядок изображений ( Данные, полученные из angularjs / ui-sortable, поэтому массив $ newImgOrder представляет новый порядок .)

(array) $newImgOrder = ['test.jpeg', 'another.jpeg'];

Images::select('url')->where('project_id', '=', $args['id'])->get()
   ->each(function($img) use (&$newImgOrder) {
       foreach ($newImgOrder as $item) {
           $img->url = $item;
           $img->save(); 
       }
   });

*ОБНОВЛЕНО = ПРАВИЛЬНО ДЛЯ ИСПОЛНЕНИЯ ЭТОГО ДЕЙСТВИЯ *

Спасибо @ Девон

Удален foreach + select ()

(array) $newImgOrder = ['test.jpeg', 'another.jpeg'];

Images::where('project_id', '=', $args['id'])->get()
   ->each(function($img) use (&$newImgOrder) {
           $img->url = array_shift($item);
           $img->save(); 
       }
   });

Вот краткая демонстрация того, чтоя хочу сделать:

Состояние таблицы перед действием

+---------+-------------+--------------+
| id      | project_id  | url          |  
+---------+-------------+--------------+
| 1       | 15          | another.jpeg |
+---------+-------------+--------------+
| 2       | 15          | test.jpeg    |
+---------+-------------+--------------+

Ожидаемые результаты =

+---------+-------------+--------------+
| id      | project_id  | url          |  
+---------+-------------+--------------+
| 1       | 15          | test.jpeg    |
+---------+-------------+--------------+
| 2       | 15          | another.jpeg |
+---------+-------------+--------------+

Фактические результаты =

+---------+-------------+--------------+
| id      | project_id  | url          |  
+---------+-------------+--------------+
| 1       | 15          | another.jpeg |
+---------+-------------+--------------+
| 2       | 15          | another.jpeg |
+---------+-------------+--------------+

В чем проблема с этой итерацией.Я пытался с двойным foreach, но я получил те же результаты ... Я что-то упускаю?Любая помощь будет принята с благодарностью.Спасибо.

1 Ответ

0 голосов
/ 29 ноября 2018

Для каждого изображения ваш код перебирает $ newImageOrder и сохраняет URL для этого изображения.Следовательно, вы выполняете два сохранения для каждого изображения, что явно не то, что вы хотите.

Нет причин для внутреннего цикла foreach.Если вы уверены, что количество элементов в $ newImageOrder будет соответствовать количеству строк в вашем запросе, и, поскольку вы передаете $ newImageOrder в качестве ссылки на замыкание, вы можете использовать shift:

each(function($img) use (&$newImgOrder) {
   $img->url = array_shift($newImgOrder);
   $img->save();
});

Это сместит первый элемент с массива и вернет его, что означает, что вы будете удалять и использовать первый элемент $ newImgOrder для каждой итерации.

Имейте в виду, это изменчивое изменение.$ newImgOrder видоизменяется закрытием.Если это не то, что вам нужно, вы можете вместо этого использовать текущий счет для смещения.

...