Laravel 迁移外键不起作用

问题描述 投票:0回答:2

我正在 Laravel 上创建一个新的应用程序,并且正在编写迁移,我想为我的列设置外键,所以我的做法如下:

   Schema::create('products', function (Blueprint $table) {
            $table->id();
            $table->integer('type_id');
            $table->string('name');
            $table->integer('status_id')->default(0);
            $table->integer('category_id')->default(0);
            $table->integer('store_id');
            $table->timestamps();
            $table->foreign('status_id')->references('id')->on('product_statuses');
            $table->index('status_id');
            $table->foreign('type_id')->references('id')->on('product_types');
            $table->index('type_id');
            $table->foreign('category_id')->references('id')->on('product_categories');
            $table->index('category_id');
            $table->foreign('store_id')->references('id')->on('stores');
            $table->index('store_id');

但这些不起作用当我在

phpmyadmin
中签入时,它允许我插入任何数字,而不是来自
status_id
的项目,例如,当我在
design
选项卡中签入时,我看不到之间的关系桌子。 #编辑

添加

product_types
迁移:

 /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('product_types', function (Blueprint $table) {
            $table->id();
            $table->string('name');
            $table->timestamps();
        });
    }

关于引擎,我正在使用 Wamp 和 MySQL v8,我认为它支持 fk 功能

php mysql laravel migration
2个回答
7
投票

正如您在评论中所说:

我看到的是,在表上的 phpmyadmin 中有一列写着 :Type :MyISAM 。发动机也是这个意思吗?

您的数据库默认引擎是MyISAM,不支持关系型功能。

要修复您可以编辑

config/database.php
文件的问题,请搜索
mysql
条目并进行更改:

'engine' => null,

'engine' => 'InnoDB',

然后您必须重新创建表格。


如果您因任何原因无法删除并重新创建表,则可以创建新的迁移来更改现有表。即:

public function up()
{
    $tables = [
        'product_types',
        'products',
    ];
    foreach ($tables as $table) {
        DB::statement('ALTER TABLE ' . $table . ' ENGINE = InnoDB');
    }
}

另一件事,外键列的数据类型必须与相关列的数据类型相同。

由于

$table->id()
$table->bigIncrements('id')
的别名,如 laravel 最新版本文档中所述,您应该使用:

$table->unsignedBigInteger('type_id');

$table->foreign('type_id')->references('id')->on('product_types');

另请注意顺序:首先创建列,然后创建 fk 引用(而不是相反)。

参考:https://laravel.com/docs/8.x/migrations#foreign-key-constraints


0
投票

在 Laravel 中创建新表时。迁移将如下生成: 你的桌子应该是: $table->increments('id');

而不是(在较旧的 Laravel 版本中):

$表->id();

© www.soinside.com 2019 - 2024. All rights reserved.