Laravel迁移使用onDelete('set null')报错的原因及解决方法
搞定Laravel迁移中外键创建失败的坑
最近为了深挖Laravel框架的细节,我搭了个标准博客项目,包含User、Post、Category三个核心模型。在给模型设置关联,并且在外键上加上onDelete('set null')规则后,执行迁移居然报错了,折腾了好一会儿才找到问题根源。
问题排查过程
一开始我盯着外键的代码反复核对,确认语法完全没问题:
$table->foreignId('category_id')->nullable()->constrained()->onDelete('set null');
后来才反应过来关键问题——Laravel的迁移文件是按文件名的字母顺序执行的!我之前先创建了posts的迁移文件,之后才建的categories迁移文件,导致执行迁移时,posts表先被创建,这时候categories表还没生成,数据库找不到categories.id这个字段来建立外键关联,直接触发了报错。
解决办法
其实操作起来很简单,只要调整迁移文件的文件名,让categories的迁移文件时间戳比posts的早就行。比如原来posts迁移文件的前缀是2024_05_01_100000,那把categories迁移文件的前缀改成2024_05_01_090000,这样迁移执行时就会优先创建categories表,再创建posts表,外键关联就能顺利建立了。
内容的提问来源于stack exchange,提问作者Alex
相关产品推荐
相关产品推荐

