我在Laravel有一个播种机
public function run()
{
$user = App\Admin::create([
'first_name' => 'first',
'last_name' => 'last',
'phone' => '',
'email' => 'mail@gmail.com',
]);
}
在此电子邮件中是唯一的
php artisan db:seed
当我第一次运行它的输入记录到数据库时,当我再次运行它的显示重复的条目。
SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry 'mail@gmail.com' for key 'email'
我可以选择忽略它吗??
答案 0 :(得分:1)
尝试在每次运行之前刷新数据库。导入方式:
使用Illuminate \ Foundation \ Testing \ RefreshDatabase;
...并将其放在班级顶部:
使用RefreshDatabase;
(来自:https://laravel.com/docs/5.8/database-testing#resetting-the-database-after-each-test)
答案 1 :(得分:1)
您可以在模型上使用firstOrCreate()
方法,如下所示:
public function run()
{
App\Admin::firstOrCreate([
'first_name' => 'first',
'last_name' => 'last',
'phone' => '',
'email' => 'mail@gmail.com',
]);
}
如果要插入多个记录,可以在run()
函数中执行以下操作:
$records = [
[
'first_name' => 'first',
'last_name' => 'last',
'phone' => '',
'email' => 'mail@gmail.com',
],
[
'first_name' => 'first2',
'last_name' => 'last2',
'phone' => '',
'email' => 'mail2@gmail.com',
]
];
foreach($records as $record) {
App\Admin::firstOrCreate($record);
}
我想确保没有在数据库中插入重复的值,因此随时可以在播种机中使用此技巧。 firstOrCreate()
方法在创建记录之前先检查记录是否在数据库中。
答案 2 :(得分:0)
我们可以选择检查表中是否存在给定的电子邮件。
public function run(){
$admin = DB::table('admins')->where('email', '=', 'mail@gmail.com')->first();
if ($admin === null) {
// user doesn't exist
$user = App\Admin::create([
'first_name' => 'Walter',
'last_name' => 'Brown',
'phone' => '',
'email' => 'admin@gmail.com',
'password' => Hash::make('Admin123'),
'is_active' => 1,
'remember_token' => str_random(10)
]);
}
}
答案 3 :(得分:-1)
答案 4 :(得分:-1)
填充数据库的简单方法是创建一个工厂,然后使用该工厂运行种子。
通常在data / factories目录中创建工厂:
$factory->define(App\Admin::class, function (Faker\Generator $faker) {
return [
'first_name' => $faker->firstName,
'last_name' => $faker->lastName,
'phone' => $faker->phoneNumber,
'email' => $faker->email
];
});
然后运行您的播种机:
factory(Admin::class, 20)->create();
此示例将创建20个用户并将其存储。
以上示例使用Faker生成随机数据https://github.com/fzaninotto/Faker