обновите несколько строк в laravel с помощью красноречивого

#php #mysql #laravel #database #eloquent

Вопрос:

Предположим, у нас есть одна база данных, в которой одна таблица называется «отцы», а другая таблица называется «дети».

Я хочу заполучить всех детей, чей отец мамали.

 $pls = children::where(['father_id' =gt; 5, 'isGoodBoy' =gt; true])-gt;take(4)-gt;get();   

И я хочу изменить $pls и установить father_id на 7 , 8 , 50 , 55 . так что можете сделать это по одному запросу в foreach :

 for ($i = 0; $i lt; count($pls); $i  ) {  $pls[$i] = $arayWhoWantBaby[$i];  $pls[$i]-gt;save(); }  

Это работает, но выполняется со многими запросами…(в этом примере 1 запрос на получение и 4 запроса на обновление ! )

Я хочу сделать это с помощью одного или двух запросов к БД,один для получения данных из БД, а другой для набора новых данных с одним запросом для выполнения всей работы и обновления элементов $pls[0][1][2]…

одна вещь, как ключевое слово «in» в sql для обновления ;

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

1. Поскольку вы пытаетесь обновить каждый из четырех результатов с разным значением, нет никаких красивых способов сделать это. Даже при использовании необработанного sql это означало бы использование case when внутри запроса на обновление

2. вау, я думаю, что эта решетка solution.is как безопасно выполнять необработанный sql в laravel?

3. Конечно, привязка входных данных.

4. Я слышал от людей, что этот метод не очень безопасен . В любом случае, мне не нравятся orms как elquent или doctrine.is привязка действительно безопасна?

5. Так и должно быть. В этом-то все и дело. Избегание любого вредоносного ввода для предотвращения внедрения sql. Однако я все равно советую вам использовать ORM.

Ответ №1:

Вот что я имел в виду. Честно говоря, я бы просто ограничился дополнительными 4 запросами. Небольшие обновления, подобные этому, не должны быть проблемой.

Кроме того, подобное поведение не вызовет никаких красноречивых событий.

 $father_ids = [7, 8, 50, 55]; $children_ids = children::where(['father_id' =gt; 5, 'isGoodBoy' =gt; true])-gt;take(4)-gt;pluck('id')-gt;all();  $sql = lt;lt;lt;SQL UPDATE  children SET  father_id = CASE id  WHEN :children_id_1 THEN :father_id_1  WHEN :children_id_2 THEN :father_id_2  WHEN :children_id_3 THEN :father_id_3  WHEN :children_id_4 THEN :father_id_4  END WHERE  id IN (:children_id_1, :children_id_2, :children_id_3, :children_id_4) SQL;  $bindings = [  'children_id_1' =gt; $children_ids[0],  'children_id_2' =gt; $children_ids[1],  'children_id_3' =gt; $children_ids[2],  'children_id_4' =gt; $children_ids[3],  'father_id_1' =gt; $father_ids[0],  'father_id_2' =gt; $father_ids[1],  'father_id_3' =gt; $father_ids[2],  'father_id_4' =gt; $father_ids[3], ];  DB::update($sql, $bindings);