有什么方法可以运行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
以仅添加我的新行。
这可能吗?
答案 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)
答案 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