#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);