Laravel 外键,还是没有外键?定义拉维关系

Laravel 外键,还是没有外键?定义拉维关系,laravel,laravel-5,eloquent,laravel-5.2,Laravel,Laravel 5,Eloquent,Laravel 5.2,定义外键与仅仅创建一个名为用户id的整型列之间有什么区别 // create_posts migrations $table->integer('user_id')->unsigned(); // vs $table->foreign('user_id')->references('id')->on('users'); 它们可以互换使用吗?每一个都有什么用途?第一个定义还是第二个定义被认为是最佳实践 编辑 命令$post->user()将以任何一种方式工作,那么使

定义外键与仅仅创建一个名为用户id的整型列之间有什么区别

// create_posts migrations
$table->integer('user_id')->unsigned();
// vs
$table->foreign('user_id')->references('id')->on('users');
它们可以互换使用吗?每一个都有什么用途?第一个定义还是第二个定义被认为是最佳实践

编辑
命令
$post->user()
将以任何一种方式工作,那么使用外键会带来什么好处呢?

不,它们不能互换使用,而且每个外键都有自己的用法。要在列上定义索引时使用索引,表示数据库索引,请参阅。但当您定义外键时,它会为该列设置一个索引(用于搜索,…),并在用户表中的user_id和id列之间建立一个关系,所以如果存在id为10的用户,则可以在另一个表中使用user_id=10。此外,它还有另一个好处,如确保数据集成。例如,如果存在属于该用户的文章,则无法按id 10删除该用户。有关详细信息。

第一行仅创建一个用户id列,而不是特殊的内容, 另一行将创建一列作为外键,它将与users表的id列紧密耦合,这将产生一些限制。
阅读有关外键的内容,了解我经常使用的最佳实践:

$table->unsignedInteger('user_id');
$table->foreign('user_id')->references('id')->on('users');
不要把索引的定义和外键混为一谈,它们的意思不一样

$table->integer('user_id')->unsigned();
// Above command is creating a column in database and it is required to have the required table structure

$table->foreign('user_id')->references('id')->on('users');
// Above command is creating foreign key index and making reference to id in users table.
正如您从命令解释中所看到的,它们不能互换,您需要第一个命令才能拥有第二个命令,如果没有第一个命令,第二个命令就会抱怨

最佳做法是将两者一起使用

下面列出了几个优点:

  • 您可以实现级联更新/删除
  • 数据库级验证只记录用户id的有效值(以避免某些人输入999999,这可能是无效的或不存在的用户id)
  • 以上两个是主要优势,您可以表达多种场景,说明以上两个如何成为生命的救星

    假设在post表中,由于脚本生成器用户_id=9999中的人为错误或bug。你认为$post->user()可以做什么

    除非您可以在不引用任何用户的情况下发布帖子,否则您可以看到,如果不使用外键,您可能会发现多个逻辑问题


    如果用户从数据库中删除/删除,则将外键视为强制关系和处理post。

    如果第二列只会造成限制,为什么我要使用它?这取决于您希望如何创建系统,通过限制,我的意思是,由于这个外键引用,您无法从users表中删除记录,这也是关于系统的,根据我的说法,系统松散耦合越多,扩展空间就越大..为什么这是最佳做法?因为您可以更好地阅读用户id是无符号整数。如果你写$table->integer('user_id')->unsigned(),你需要阅读更多的代码才能意识到你的user_id是未签名的。谢谢,但是我问了外键的用法。尽管
    unsignedInteger
    的用法看起来非常简洁