Laravel - 使用Schema Builder创建Foreign Key的注意事项

25 篇文章 0 订阅
4 篇文章 0 订阅

Laravel的Schema Class提供了一种不可知(agnostic way)的方式来操作table,即对于所有Laravel所支持的数据库都可以用统一的方法及API来操作,而Laravel并不需要知道当前使用的是哪一个具体的数据库。

在使用Schema Class的时候,我们可以很方便地为当前的table添加foreign key:

$table->integer('user_id')->unsigned();
$table->foreign('user_id')->references('id')->on('users');
 
 
  • 1
  • 2
  • 1
  • 2

以上代码中,我们为当前table添加了一个unsigned integer column,并且让该column作为foreign key来指向users这个table中的id column。

注意:一定要先创建column才能使用->foreign()来指向其他table。在本例中即必须先创建user_id这个column才能继续创建foreign key。

如果要添加ON DELETE或者ON UPDATE的选项也很简单:

$table->foreign('user_id')
      ->references('id')->on('users')
      ->onUpdate('cascade')
      ->onDelete('cascade');
 
 
  • 1
  • 2
  • 3
  • 4
  • 1
  • 2
  • 3
  • 4

是不是感觉和MySQL的语法很相似呢?

如果要删除一个foreign key,可以使用dropForeign这个方法:

$table->dropForeign('posts_user_id_foreign');
 
 
  • 1
  • 1

还有非常重要的:由于使用->increments()创建的column(通常是id)相对应的类型是unsigned integer(并且该column会自动作为primary key),所以在创建foreign key的时候,一定要记得把column添加->unsigned():

$table->integer('user_id')->unsigned();
 
 
  • 1
  • 1

这个步骤非常重要,如果没有添加,那么在用artisan进行migrate的时候会报错,而报错信息只会显示:

php artisan cannot add foreign key

以上信息中我们并不能看出问题所在。如果我们手动添加一下这个foreign key,可以看到如下结果:

adminer add foreign key error

我们可以看到,红字的部分描述了问题所在,即当前table中所作为foreign key的column必须和目标table中的column类型匹配。 
这也就是为什么我们必须添加->unsigned()的原因。

如需更多的参考,可以移步至Laravel官方Documentaion: 
https://laravel.com/docs/4.2/schema#foreign-keys

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值