Laravel 迁移外键不起作用
Posted
技术标签:
【中文标题】Laravel 迁移外键不起作用【英文标题】:Laravel foreign key on migration is not working 【发布时间】:2021-02-08 04:21:10 【问题描述】:我正在 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 功能
【问题讨论】:
我认为 fk 列应该是unsigned
。即$table->integer('status_id')->unsigned()
或$table->bigInteger('status_id')->unsigned()
@porloscerrosΨ 我不走运,但在 phpmyadmin 上它们之间没有关系
请向我们展示product_statuses
迁移。并确认您的数据库引擎支持外键。即 mysql 的 Innodb(而不是 myisam)
请检查我已将迁移添加到问题中
对不起,我看到的是在表格的 phpmyadmin 中有一列正在写 :Type :MyISAM 。引擎的意思是一样的吗?
【参考方案1】:
在 Laravel 中创建新表时。迁移将生成如下: 你的桌子应该是: $table->increments('id');
而不是(在旧 Laravel 版本中):
$table->id();
【讨论】:
$table->id();
= $table->bigIncrements('id')
的别名,如 laravel 最新版本文档中所述 laravel.com/docs/8.x/migrations#available-column-types
我用这个解决了同样的问题......这就是我建议的原因【参考方案2】:
正如你在 cmets 中所说的:
我看到的是,在表格上的 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()
是 laravel 最新版本文档中所述 $table->bigIncrements('id')
的别名,您应该使用:
$table->unsignedBigInteger('type_id');
$table->foreign('type_id')->references('id')->on('product_types');
还要注意顺序:首先创建列,然后是 fk 引用(而不是相反的)。
参考:https://laravel.com/docs/8.x/migrations#foreign-key-constraints
【讨论】:
谢谢你的帮助,解决了我的问题以上是关于Laravel 迁移外键不起作用的主要内容,如果未能解决你的问题,请参考以下文章