php - 如何在 Laravel 中通过一次查询保存多条记录?

标签 php mysql laravel laravel-4 eloquent

我手头有超过 100,000 条记录,如 Array of STD Objects(可以转换为 Array of ArraysArray 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_pa​​cket MySQL 变量。此变量的默认值为 1 MB,因此如果生成大于 1 MB 的 SQL 语句,将会出错。 max_allowed_packet documentation

因此,如果这是您的问题,您可以增加 max_allowed_pa​​cket MySQL 变量,使其足够大以包含您的整个 SQL 语句,或者您可以将您的插入分成足够小的 block 以适合当前 max_allowed_pa​​cket 大小(默认 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/

相关文章:

MySQL Select 基于条件选择

javascript - 如何访问类中被单击的元素

php - 加载数据 Infile OPTIONALLY ENCLOSED BY 未按预期工作

mysql - SQL:多个左连接后的情况

php - 付款后在 payment pro paypal (sandox) 中设置自动重定向

python - 如何在python中合并pandas字符串(类似连接sql)?

laravel - 将 Laravel 部署到 Elastic Beanstalk 时出现密码异常

laravel - 在多重身份验证系统上应用 Laravel 5.7 MustVerifyEmail

php - Laravel-5 登录后重定向到/home

php - 为什么 apache2 服务器最多需要 1.5 小时才能写入 6 mb .sql 文件