laravel种子唯一列忽略重复的条目

时间:2019-04-02 12:56:59

标签: php laravel laravel-5

我在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'

我可以选择忽略它吗??

5 个答案:

答案 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)

您可以通过两种方法解决它:

1)从数据库的电子邮件列中删除唯一键约束(不推荐)

2)使用伪造者库生成唯一的电子邮件地址-https://github.com/fzaninotto/Faker

答案 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