【问题标题】:laravel 8 seeding , SQLSTATE[23000]: Integrity constraint violation:laravel 8 播种,SQLSTATE[23000]:违反完整性约束:
【发布时间】:2021-07-10 00:48:00
【问题描述】:

我已将我的项目从 Laravel 7 降级到 8。但问题是,当我运行播种命令 php artisan db:seed 时,它会显示错误 SQLSTATE[23000]:完整性约束违规:。这是因为它播种了我之前运行的先前播种数据。 在运行播种命令之前我也做过

  1. 在 DatabaseSeeder.php 和其他 Seeder 文件的顶部添加 Database\Seeders 命名空间

  2. 将文件夹名称种子替换为位于 \database\ 文件夹的播种机

  3. 如下更新composer.json:

    "autoload": {
    "psr-4": {
        "App\\": "app/",
        "Database\\Factories\\": "database/factories/",
        "Database\\Seeders\\": "database/seeders/"
    }
    

    },

  4. 最后,运行下面的命令

    作曲家转储自动加载

    php 工匠数据库:种子

我还更改了 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);
    }
}

【问题讨论】:

  • 你能展示你的 DeliveryAddressTableSeeder 播种机吗?该表中有数据吗?
  • @Psycho 请结帐。我已经更新了问题
  • 如果我对播种的理解正确,您只需要在创建表后运行一次,一旦为数据库播种,除非您刷新数据库,否则您不需要再次运行它。
  • @MuqadarAli,你不想在播种前先截断你的表吗?您的收货地址的 id 设置为 1。我猜这个 ID 在您的表中设置为增量。我认为您应该截断您的表格,或者从播种机中删除“id”字段。
  • @Muqadar 根据你的播种机,Jaswinder 的回答对你来说应该足够了

标签: php laravel laravel-blade laravel-seeding


【解决方案1】:
        Eloquent::unguard();

        DB::statement('SET FOREIGN_KEY_CHECKS=0;');

        $this->call('YourTTableSeeder');

        DB::statement('SET FOREIGN_KEY_CHECKS=1;');

把这些扔进你的播种机

【讨论】:

    【解决方案2】:

    我希望 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, 'name' => '***', 'address' => 'Test 123', 'city' => '*******', 'country' => '******', 'pincode' => '*****', 'mobile' => '**********', 'status' => 1], 
                ];
        
            DeliveryAddress::insert($deliveryRecords);
      }
    

    另外,确认 user_id 列是否有任何外键约束。如果是,您应该为 id 为“1”的 users 表记录一个记录,以避免任何不良数据。

    【讨论】:

      猜你喜欢
      • 2017-09-11
      • 2015-07-17
      • 2021-07-23
      • 1970-01-01
      • 2014-08-18
      • 2015-03-19
      • 2015-11-27
      • 2015-01-20
      相关资源
      最近更新 更多