提问者:小点点

为什么在Laravel迁移中出现引用错误?


我正在创建一个Laravel电子商务网站,我正在遵循以下教程:https://www.youtube.com/watch?v=0lo7vzo1fto&list=plehehueu3x5optli631zx9cxl6cu_sdar&index=20&t=417s

我正在讲第18集,这里创建了订单表。 我正在处理它的第一部分,创建迁移。 有2个创建迁移文件:

>

  • 2020_07_10_134530_create_orders_table.php(创建订单表)

    2020_07_10_135517_create_order_product_table.php(为订单和产品创建透视表)

    我的“create_orders_table.php”如下所示:

     public function up()
        {
            Schema::create('orders', function (Blueprint $table) {
                $table->increments('id');
                $table->integer('user_id')->unsigned()->nullable();
                $table->foreign('user_id')->references('id')->on('users')
                    ->onUpdate('cascade')->onDelete('set null');
                $table->string('billing_email')->nullable();
                $table->string('billing_name')->nullable();
                $table->string('billing_address')->nullable();
                $table->string('billing_city')->nullable();
                $table->string('billing_province')->nullable();
                $table->string('billing_postalcode')->nullable();
                $table->string('billing_phone')->nullable();
                $table->string('billing_name_on_card')->nullable();
                $table->integer('billing_discount')->default(0);
                $table->string('billing_discount_code')->nullable();
                $table->integer('billing_subtotal');
                $table->integer('billing_tax');
                $table->integer('billing_total');
                $table->string('payment_gateway')->default('stripe');
                $table->boolean('shipped')->default(false);
                $table->string('error')->nullable();
                $table->timestamps();
            });
        }
    

    我的“create_order_product_table.php”如下所示:

    public function up()
        {
            Schema::create('order_product', function (Blueprint $table) {
                $table->increments('id');
                $table->integer('order_id')->unsigned()->nullable();
                $table->foreign('order_id')->references('id')
                    ->on('orders')->onUpdate('cascade')->onDelete('set null');
    
                $table->integer('product_id')->unsigned()->nullable();
                $table->foreign('product_id')->references('id')
                    ->on('iamlushes')->onUpdate('cascade')->onDelete('set null');
    
                $table->integer('quantity')->unsigned();
                $table->timestamps();
            });
        }
    

    当我执行命令时:

    php artisan migrate
    

    我从终端得到以下错误:

    rosscurrie@Rosss-Air JanVal % php artisan migrate
    Migrating: 2020_07_10_134530_create_orders_table
    
       Illuminate\Database\QueryException 
    
      SQLSTATE[HY000]: General error: 3780 Referencing column 'user_id' and referenced column 'id' in foreign key constraint 'orders_user_id_foreign' are incompatible. (SQL: alter table `orders` add constraint `orders_user_id_foreign` foreign key (`user_id`) references `users` (`id`) on delete set null on update cascade)
    
      at vendor/laravel/framework/src/Illuminate/Database/Connection.php:671
        667|         // If an exception occurs when attempting to run a query, we'll format the error
        668|         // message to include the bindings with SQL, which will make this exception a
        669|         // lot more helpful to the developer instead of just the database's errors.
        670|         catch (Exception $e) {
      > 671|             throw new QueryException(
        672|                 $query, $this->prepareBindings($bindings), $e
        673|             );
        674|         }
        675| 
    
          +11 vendor frames 
      12  database/migrations/2020_07_10_134530_create_orders_table.php:38
          Illuminate\Support\Facades\Facade::__callStatic("create")
    
          +22 vendor frames 
      35  artisan:37
          Illuminate\Foundation\Console\Kernel::handle(Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput))
    

    主要错误似乎是:

    SQLSTATE[HY000]: General error: 3780 Referencing column 'user_id' and referenced column 'id' in foreign key constraint 'orders_user_id_foreign' are incompatible. (SQL: alter table `orders` add constraint `orders_user_id_foreign` foreign key (`user_id`) references `users` (`id`) on delete set null on update cascade)
    

    我认为它指的是我的“create_orders_table.php”迁移中的这行代码:

    $table->foreign('user_id')->references('id')->on('users')->onUpdate('cascade')->onDelete('set null');
    

    我不知道如何修复此错误,下面是我的“2014_10_12_000000_create_users_table.php”迁移:

    public function up()
        {
            Schema::create('users', function (Blueprint $table) {
                $table->id();
                $table->string('name');
                $table->string('email')->unique();
                $table->timestamp('email_verified_at')->nullable();
                $table->string('password');
                $table->rememberToken();
                $table->timestamps();
            });
        }
    

    下面是我的产品表'2020_06_16_124046_create_iamlushes_table.php'迁移:

    public function up()
        {
            Schema::create('iamlushes', function (Blueprint $table) {
                $table->id();
                $table->string('name')->unique();
                $table->string('fullname')->unique();
                $table->string('productLogo');
                $table->string('img')->unique();
                $table->text('description');
                $table->integer('price');
                $table->timestamps();
            });
        }
    

    任何帮助都是非常棒的,谢谢!


  • 共1个答案

    匿名用户

    您正在使用$table->id();创建users表。 它在数据库中创建了一个类型为unsinedBigInteger的列,但您在orders表中将此列作为UnsignedInteger来引用,这会产生冲突。

    应使用unsignedbiginteger作为user_idorders的列类型,如下所示:

    Schema::create('orders', function (Blueprint $table) {
            $table->increments('id');
            $table->bigInteger('user_id')->unsigned()->nullable();
            $table->foreign('user_id')->references('id')->on('users')
                ->onUpdate('cascade')->onDelete('set null');
            
            ....your codes
    });