如果数据尚不存在,Laravel 插入种子

S_R*_*S_R 3 laravel laravel-5

有没有什么方法可以运行 laravelseed仅插入不存在的记录?

我当前的 laravel 播种机看起来像这样

DB::table('users')->insert([
                //Global Admin
                [
                    'member_id' => 11111111,
                    'firstname' => 'Joe',
                    'lastname' => 'Bloggs'
                ], 
                [
                    'member_id' => 22222222,
                    'firstname' => 'Jim',
                    'lastname' => 'Bloggs'
                ], 

            ]);
Run Code Online (Sandbox Code Playgroud)

相当标准!

我是否必须将每个插入内容都包装在 try catch 中?像这样

try {
   DB::table('users')->insert(['member_id' => 11111111, 'firstname' => 'Joe', 'lastname' => 'Bloggs']);
} catch(Exception $e){
  //Die silently
}
try {
   DB::table('users')->insert(['member_id' => 22222222, 'firstname' => 'Jim', 'lastname' => 'Bloggs']);
} catch(Exception $e){
  //Die silently
}
Run Code Online (Sandbox Code Playgroud)

稍后,我可能想向同一个播种器添加额外的行,而不必编写新行,然后重新运行php artisan db:seed以仅添加新行。

这可能吗?

por*_*s Ψ 7

您可以通过 Eloquent firstOrCreate来实现这一点。

firstOrCreate 方法将尝试使用给定的列/值对来查找数据库记录。如果在数据库中找不到模型,则会插入一条记录,其中包含第一个参数中的属性以及可选的第二个参数中的属性。

因此,如果您通过 member_id 识别用户,您可以执行以下操作:

    User::firstOrCreate(
        ['member_id' => 11111111],
        [
            'firstname' => 'anakin',
            'lastname' => 'skywalker',
            'password' => Hash::make('4nak1n')
        ]
    );
Run Code Online (Sandbox Code Playgroud)

如果您想通过“member_id”、“firstname”和“lastname”字段查找记录,如下所示:

    User::firstOrCreate(
        [
            'member_id' => 11111111,
            'firstname' => 'anakin',
            'lastname' => 'skywalker'
        ],
        [
            'password' => Hash::make('4nak1n'),
        ]
    );
Run Code Online (Sandbox Code Playgroud)