- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我手头有超过 100,000 条记录,如 Array of STD Objects
(可以转换为 Array of Arrays
或 Array of Eloquent Models
).
如何使用1 个查询 将它们全部存储在数据库中。
如果您想知道我从另一个数据库连接获取这些数据并将它们保存到我的数据库中。
当然,我可以构建每个 Eloquent 模型并调用 save()
函数,但这会花费很多时间,无论如何都不推荐。我在模型上尝试了 insert()
将一个 Eloquent 模型数组传递给它,但由于某些原因没有成功!!
除了生成原始 SQL 查询之外,我还有什么选择?
我在这里使用 Laravel 4.2。
最佳答案
您可以在模型上使用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,因此如果生成大于 1 MB 的 SQL 语句,将会出错。 max_allowed_packet documentation
因此,如果这是您的问题,您可以增加 max_allowed_packet
MySQL 变量,使其足够大以包含您的整个 SQL 语句,或者您可以将您的插入分成足够小的 block 以适合当前 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);
}
关于php - 如何在 Laravel 中通过一次查询保存多条记录?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32575038/
我是一名优秀的程序员,十分优秀!