编辑:解决方案比我更容易,迁移按字母顺序进行,我的类别迁移是在我的帖子迁移后创建的,这意味着当添加外键时categories.id
列还不存在,导致错误。更改名称以便首先创建类别表解决了问题。
为了更好地了解Laravel,我决定建立一个标准的博客网站。我有三个模型,User,Post和Category,我尝试在帖子迁移中设置一些关系:
public function up()
{
Schema::create('posts', function (Blueprint $table) {
$table->increments('id');
$table->integer('user_id')->unsigned()->index();
$table->integer('category_id')->unsigned()->nullable();
$table->string('title');
$table->text('body');
$table->timestamps();
$table->foreign('user_id')->references('id')->on('users')->onDelete('cascade');
$table->foreign('category_id')->references('id')->on('categories')->onDelete('set null');
});
}
第一个关系有效,但第二个关系错误,因为onDelete('set null')
错误Cannot add foreign key constraint (SQL: alter table 'posts' add constraint 'posts_category_id_foreign' foreign key ('category_id') references 'categories' ('id') on delete set null)
。我也试过添加这样的外键,但是我得到了同样的错误:
Schema::table('posts', function (Blueprint $table) {
$table->foreign('user_id')->references('id')->on('users')->onDelete('cascade');
$table->foreign('category_id')->references('id')->on('categories')->onDelete('set null');
});
但是,如果我删除第二次迁移并在HeidiSQL中手动添加它,它可以正常工作:
据我所知,使用set null
需要做两件事,使列可以为空(我已经完成),并添加与onDelete('set null')
的关系。在Laravel 5.5中根本不支持onDelete('set null')
,还是我做错了什么?
如果重要,我的类别迁移:
public function up()
{
Schema::create('categories', function (Blueprint $table) {
$table->increments('id');
$table->string('name');
$table->timestamps();
});
}