【问题标题】:Why am I getting a Referencing Error in my Laravel migration?为什么我在 Laravel 迁移中遇到引用错误?
【发布时间】:2020-11-01 03:02:35
【问题描述】:

我正在创建一个 Laravel 电子商务网站,我正在学习本教程:https://www.youtube.com/watch?v=0lo7vzO1Fto&list=PLEhEHUEU3x5oPTli631ZX9cxl6cU_sDaR&index=20&t=417s

我在第 18 集,其中创建了 Order 表。我正在努力处理它的第一部分,创建迁移。有两个创建迁移文件:

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

  2. 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();
        });
    }

【问题讨论】:

  • 我不是 100%,但我猜是 ->nullable() 导致了以下问题:$table->integer('user_id')->unsigned()->nullable(),因为引用的列(另一个表的主键)不可为空。 $table->integer('order_id')->unsigned()->nullable(); 也是如此。如果一列与另一列有外键,则它们必须相同。

标签: php laravel database-migration


【解决方案1】:

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

您应该在orders 表中使用unsignedBigInteger 作为user_id 的列类型,如下所示:

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 code
});

【讨论】:

  • 是的,它可以解决您的问题。另一种方法是我在答案中发布的更新代码。更改orders表中user_id的列。
猜你喜欢
  • 2021-07-07
  • 2020-07-08
  • 2018-02-13
  • 2017-10-08
  • 2017-10-13
  • 2020-08-02
  • 2021-08-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多