2017-02-05 53 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語句來做到這一點。

在PHP和mysqli的我可以創建我所有的更新查詢的查詢,然後向他們發送一個查詢,有10 update語句的查詢,現在我怎麼能做到這一點的laravel ???

+0

既然你有數組,你爲什麼不想循環?你仍然需要循環訪問數組內容。 –

+0

因爲它不是一個很好的解決方案,以發送數據庫查詢在一個循環中,我只想要在PHP和mysqli的我可以創建我所有的更新查詢的查詢一個查詢 –

回答

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",在這樣你不得不遍歷ArrayLaravel Collection更新個別記錄某一水平。因爲這些是更新並且每個都有不同的標識列。

另一方面,如果您的標識列匹配多個記錄 laravel支持Mass Update,即萬一您的where子句匹配多個元素。

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

做到這一點,然後向他們發送一個查詢,查詢10 update語句,現在我怎麼能做到這一點的laravel ??? –

+0

都能跟得上存在laravel這樣沒有這樣的事情。 – rummykhan

0

您只能更新每個記錄的相同值。

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

這是一個插入,我怎麼能做到這一點的更新? –

+0

@AfshinEzadi只能爲每個相同的值更新record.if你認爲這可以用原始的SQL查詢來來達到的,你可以隨時'DB ::原料'在laravel()使用。 –

相關問題