[英]How to save multiple records with one query in Laravel?
作為Array of STD Objects
我手中有超過100,000條記錄(可以轉換為Array of Arrays
或Array of Eloquent Models
)。
如何通過1個查詢將所有這些存儲在數據庫中。
如果您想知道我是從另一個數據庫連接中獲取這些數據並將其保存到我的數據庫中的。
當然,我可以構建每個Eloquent模型並調用save()
函數,但這將花費大量時間,因此不建議這樣做。 我在模型上嘗試了insert()
函數,將一個Eloquent模型數組傳遞給它,但是由於某些原因而沒有用!
那么,除了生成原始SQL查詢之外,我還有什么選擇?
我在這里使用Laravel 4.2。
您可以在模型上使用insert()
方法,但它必須是一個數組數組。 您還需要確保所有陣列條目都具有相同的鍵。 如果某個條目缺少密鑰,則該條目的插入值可能會關閉。
您提到您是從對象數組開始的。 您可以將該對象數組轉換為數組數組,然后使用insert語句。
假設您有一個Book
模型:
$data = [
(object) [
'title' => 'Title 1',
'author' => 'Author 1',
'publisher' => 'Publisher 1',
],
(object) [
'title' => 'Title 2',
'author' => 'Author 2',
'publisher' => null, // make sure key exists; use null value;
],
];
// Convert your objects to arrays. You can use array_walk instead,
// if you prefer to just modify the original $data
$arrayData = array_map(function($value) {
return (array) $value;
}, $data);
// do the insert
$success = Book::insert($arrayData);
// view last query run (to confirm one bulk insert statement)
$log = DB::getQueryLog();
print_r(end($log));
我不知道有關您現有數據的詳細信息,因此您可能需要一些更復雜的邏輯來確保數組正確,但是以上內容是應該起作用的要點。
當進行這樣的批量插入時,您還需要注意max_allowed_packet
MySQL變量。 該變量的默認值為1 MB,因此,如果生成的SQL語句大於1 MB,則會出現錯誤。 max_allowed_packet文檔
因此,如果這是您的問題,則可以增加max_allowed_packet
MySQL變量,使其足夠大以包含整個SQL語句,也可以將插入分成足夠小的塊以適合當前的max_allowed_packet
大小(默認為1 MB) )。
對插入內容進行分塊的示例:
// assume $arrayData is your array of arrays
// you can come up with some fancy algorithm to determine your optimal
// chunk size if you want.
$size = 100;
$chunks = array_chunk($arrayData, $size);
foreach($chunks as $chunk) {
Book::insert($chunk);
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.