Awa*_*rni 10 php laravel eloquent laravel-5.2
我需要在数据库表中插入一大组记录.我从CSV文件中获取数据.我考虑过使用多插入语句以获得良好的性能.所以我做了类似以下的事情:
foreach($data as $key => $value) {
$insert[] = [
'id' => $value->id, 'is_published' => $value->is_published,
"first_name" => $value->first_name, "middle_name" => $value->middle_name, "last_name" => $value->last_name,
"description" => $value->description,
"created_at" => date("Y-m-d H:i:s",strtotime($value->created_at)),
"updated_at" => date("Y-m-d H:i:s",strtotime($value->changed_at))
];
}
if(!empty($insert)){
Model::insert($insert);
}
Run Code Online (Sandbox Code Playgroud)
但是这样做我总是看到错误:
mysql服务器消失了.
我通过打印查询来调试它,我发现通过这样做,Laravel不会在描述值中处理单引号或双引号,因为它在使用时会自动执行$model::save();.如果描述值中包含单引号'或双引号",则打印的查询版本会中断.
但是,如果我做一些像
foreach($data as $key=>$value){
$model = new Model();
$model->id = $value->id;
$model->description = $value->description;
blah blah bla
$model->save();
}
Run Code Online (Sandbox Code Playgroud)
它成功运行而不会产生任何错误.任何人都可以让我知道如何纠正这个问题?
由于大量数据,报价问题没有任何问题。当您尝试使用多重插入一次插入所有行时,数据集会变得太重。您要么需要增加 max_allowed_packet,要么需要分块进行。您可以为此使用块。假设您想一次插入 100 个元素。你可以做类似的事情。
if(!empty($insert))
{
$collection = collect($insert)->chunk(100)->toArray();
foreach ($collection as $insert)
{
// It will insert 100 items at a time
Model::insert($insert);
}
}
Run Code Online (Sandbox Code Playgroud)
希望这会有所帮助:)