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

时间:2019-06-19 14:35:34

标签: laravel laravel-5

有什么方法可以运行laravel seed仅在记录不存在时插入它们吗?

我现在的laravel播种机看起来像这样

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

            ]);

相当标准!

我是否必须将每个插入物都包裹在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
}

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

这可能吗?

5 个答案:

答案 0 :(得分:2)

无论如何,播种仅应用于测试。

您为什么不执行php artisan migrate:fresh --seed

这将刷新数据库(删除表),然后再次运行所有迁移,最后再次为数据库播种。

您永远不应该在生产中使用播种机。

只需将新数据添加到播种机中,运行migrate:fresh并重新播种即可:)

答案 1 :(得分:1)

stokoe0990所述,不建议在生产中运行播种机。 Laravel Seeder被编写为生成测试数据的方式。根据{{​​3}}“ Laravel提供了一种使用种子类向数据库提供测试数据的简单方法。”

也就是说,满足问题的唯一方法是将逻辑构建到种子中:

$users = array(
    ['member_id' => 11111111,'firstname' => 'Joe','lastname' => 'Bloggs'], 
    ['member_id' => 22222222,'firstname' => 'Jim','lastname' => 'Bloggs']
);

foreach ($users as $user) {
  if (\App\User::find($user['id'])) {
    DB::table('users')->insert($user);
  }
}

答案 2 :(得分:1)

您可以通过口才firstOrCreate实现。

  

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

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

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

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

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

答案 3 :(得分:0)

您可以使用雄辩的updateOrInsert()方法来实现:

DB::table('users')->updateOrInsert('your_data');

详细了解here

答案 4 :(得分:0)

我建议最好的方法是在迁移时截断(或删除所有)表中的数据。尝试这样的事情:

//data in the table
DB::table('users')->delete(); //or use model like this: User::truncate();

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

然后,当您运行php artisan db:seed

时,将没有重复项