2017-02-05 1 views
1

думаю, что мой стол как этотКаков наилучший способ обновить группу строк в Laravel

+--------+-------------------+-----------+ 
| ID  | Type    | nOrder | 
+--------+-------------------+-----------+ 
| 1  | A     | 0   | 
| 2  | A     | 1   | 
| 3  | A     | 2   | 
| 4  | B     | 0   | 
| 5  | B     | 1   | 
| 6  | B     | 2   | 
| 7  | B     | 3   | 
| 8  | B     | 4   | 
| 9  | C     | 0   | 
| 10  | C     | 1   | 
+--------+-------------------+-----------+ 

и у меня есть массив как этот

+--------+-------------------+-----------+ 
| ID  | Type    | nOrder | 
+--------+-------------------+-----------+ 
| 5  | A     | 0   | 
| 4  | A     | 1   | 
+--------+-------------------+-----------+ 

я хочу, чтобы обновить таблицу эти новые строки в laravel, есть ли какой-либо способ этого в laravel без цикла? если нет, то как я могу это сделать с помощью sql statment.

в php и mysqli я мог бы создать запрос ко всем моим запросам обновлений, а затем отправить их в запрос, запрос с 10 инструкциями по обновлению, теперь как я могу сделать это в laravel ???

+0

Поскольку у вас есть массив, почему вы не хотите контура? Для доступа к содержимому массива по-прежнему необходимо выполнить цикл. –

+0

, потому что это нехорошее решение для отправки запроса базы данных в цикле, я хочу сделать это только одним запросом –

ответ

0

Если вы хотите сделать это, используя один запрос в mySQL, у вас есть 2 варианта.

Вариант 1: Используйте replace into MySQL построить так:

$query = "replace into {$table} values (?, ?, ?), (?, ?, ?)"; 
$insertArray = [[5, "A", 0], [4, "A", 1]]; 
DB::insert($query, array_flatten($insertArray)); 

Вариант 2: Используйте insert into on duplicate key MySQL построить так:

$query = "insert into {$table} values (?, ?, ?), (?, ?, ?) on duplicate key update ID = VALUES(ID), Type = VALUES(Type), nOrder = VALUES(nOrder)"; 
$insertArray = [[5, "A", 0], [4, "A", 1]]; 
DB::insert($query, array_flatten($insertArray)); 

Разница между 2 - это замена в вставки (для новой строки) или удаляет, затем вставляет (для существующей строки). Однако вставить на дубликат ключа выполняет вставку для новой строки и обновления для существующей строки

Вы можете использовать this package для обоих вариантов

альтернатива, если вам нужна скорость исполнения, но и не хотите использовать необработанные запросы, например, для использования database transactions

0

насчет Mass updates

Model::where('type', 'A')->where('nOrder', '<', 2)->update(['foo' => 'bar']) 

Ваши атрибуты должны быть установлены в $fillable в вашей модели. Другими словами, вы должны добавить $fillable = ['foo'] в свою модель.

0

IMO Там нет "laravel way" делать что-то вроде этого, На каком-то уровне, как это вы должны перебрать Array или Laravel Collection для обновления отдельных записей. Потому что это обновления и каждый из которых имеет разные столбцы Identity.

С другой стороны, если ваш столбец идентификаторов соответствует несколько записей Laravel поддерживает Mass Update, то есть в случае, если ваш где положение соответствует более одного элемента.

App\Flight::where('active', 1) 
      ->where('destination', 'San Diego') 
      ->update(['delayed' => 1]); 
+0

в php и mysqli. Я мог бы создать запрос ко всем моим запросам обновлений, затем отправить их в запрос, запрос с 10 оператором обновления, теперь, как я мог сделать это в laravel ??? –

+0

Нет такой вещи в ларавеле. – rummykhan

0

Вы можете обновлять только те же значения для каждой записи.

$values = [['Type' => 'A'],['nOrder' => '0']]; 
DB::table('table_name')->whereIn('id', [4, 5])->update($values); 
+0

это вставка, как я могу это сделать для обновления? –

+0

@AfshinEzadi Вы можете обновлять только те же значения для каждой записи. Если вы думаете, что это может быть достигнуто с помощью необработанного SQL-запроса, вы всегда можете использовать 'DB :: raw()' в laravel. –

 Смежные вопросы

  • Нет связанных вопросов^_^