问题描述
我已经将我的项目从 Laravel 7 降级到 8。但问题是当我运行播种命令 PHP artisan db:seed 时,它显示了一个错误 sqlSTATE[23000]: Integrity constraint conflict:。这是因为它播种了我之前运行的先前播种数据。 我在运行播种命令之前也做过
-
在 DatabaseSeeder.PHP 和其他 Seeder 文件的顶部添加 Database\Seeders 命名空间
-
更新 composer.json 如下:
"autoload": { "psr-4": { "App\\": "app/","Database\\Factories\\": "database/factories/","Database\\Seeders\\": "database/seeders/" }
},
-
最后,运行下面的命令
作曲家转储自动加载
PHP artisan db:seed
我还更改了 DatabaseSeeder 命令 $this->call(DeliveryAddresstableSeeder::class);
DeliveryAddresstableSeeder
<?PHP
namespace Database\Seeders;
use Illuminate\Database\Seeder;
use App\DeliveryAddress;
class DeliveryAddresstableSeeder extends Seeder
{
/**
* Run the database seeds.
*
* @return void
*/
public function run()
{
//
$deliveryRecords = [
['id' => 1,'user_id' => 1,'name' => '***','address' => 'Test 123','city' => '*******','country' => '******','pincode' => '*****','mobile' => '**********','status' => 1],];
DeliveryAddress::insert($deliveryRecords);
}
}
解决方法
我希望 DeliveryAddress 迁移将包含带有 $table->id(); 的列;宣言。在这种情况下,您的播种机在多次运行时会在 id 列中插入重复值。
您可以在运行播种机之前截断表格。
<?php
namespace Database\Seeders;
use Illuminate\Database\Seeder;
use App\DeliveryAddress;
class DeliveryAddressTableSeeder extends Seeder
{
/**
* Run the database seeds.
*
* @return void
*/
public function run()
{
DeliveryAddress::truncate();
//
$deliveryRecords = [
['id' => 1,'user_id' => 1,'name' => '***','address' => 'Test 123','city' => '*******','country' => '******','pincode' => '*****','mobile' => '**********','status' => 1],];
DeliveryAddress::insert($deliveryRecords);
}
}
或者您可以跳过插入 id 列的值,因为它是自动递增值。
public function run()
{
$deliveryRecords = [
['user_id' => 1,];
DeliveryAddress::insert($deliveryRecords);
}
另外,确认 user_id 列是否有任何外键约束。如果是,你应该有一个用户表的记录,id 为“1”,以避免任何错误数据。
, Eloquent::unguard();
DB::statement('SET FOREIGN_KEY_CHECKS=0;');
$this->call('YourTTableSeeder');
DB::statement('SET FOREIGN_KEY_CHECKS=1;');
把这些扔进你的播种机