在用Laravel做项目时,有一个需求是要将近10万行的JSON数据导入数据库中(每一行都是一个合法的JSON数据)。如果使用web端的Model写入数据,网页响应肯定超时,而且也不容易看到执行过程。因此这种需求最好用命令行来执行。
在几经搜索后,发现Laravel提供了一个完美的批量数据导入功能:Seeder。这是一个可以自动生成数据的模块。
使用Seeder完成上面说的过程如下:(参考Laravel批量写入数据详解)
1. 用php artisan make:seeder SeederName的形式,创建一个seeder。运行完这行命令后,切换到database/seeds/,里面有两个文件:DatabaseSeeder.php和自己创建的那个Seeder,比如我的叫XdhywordSeeder.php。
2. 打开XdhywordSeeder.php,在run方法里写自己插入数据的代码。比如我要达到的目的是读取文件test1.txt中的每一行JSON,存在数据库中。
XdhywordSeeder.php:
<?php
use Illuminate\Database\Seeder;
class XdhywordSeeder extends Seeder
{
/**
* Run the database seeds.
*
* @return void
*/
public function run()
{
$file = fopen('public/test1.txt', "r");
//$data = [];
$data = 0;
while(! feof($file))
{
$content = fgets($file); //逐行取出
//$data[] = $content;
if (trim($content)){
$indata = [
'detail' => str_replace("'", '"', trim($content)),
];
$word = new \App\Models\Xdhyword($indata);
$word->save();
$data += 1;
}
echo $data .'\n';
}
fclose($file);
}
}
我的test1.txt是这样的:
{"a":100,"b":20}
{"a":120,"b":10}
{"a":230,"b":30}
xdhywords数据表结构如下,detail字段类型选用JSON:
+------------+---------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+------------+---------------------+------+-----+---------+----------------+
| id | bigint(20) unsigned | NO | PRI | NULL | auto_increment |
| detail | json | NO | | NULL | |
| created_at | timestamp | YES | | NULL | |
| updated_at | timestamp | YES | | NULL | |
+------------+---------------------+------+-----+---------+----------------+
4 rows in set (0.00 sec)
3. 再回到命令行,执行:php artisan db:seed,就可以运行起来了,等一段时间后,数据就全部存入数据库了。