Laravel 8 一对多
一对多关联用于定义单个模型拥有任意数量的其它关联模型。例如,一篇博客文章可能会有无限条评论。正如其它所有的 Eloquent 关联一样,一对多关联的定义也是在 Eloquent 模型中写一个方法:
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
class Post extends Model
{
/**
* 获取博客文章的评论
*/
public function comments()
{
return $this->hasMany('App\Models\Comment');
}
}
记住一点,Eloquent 将会自动确定 Comment
模型的外键属性。按照约定,Eloquent 将会使用所属模型名称的「Snake Case」形式,再加上 _id
后缀作为外键字段。因此,在上面这个例子中,Eloquent 将假定 Comment
模型对应到 Post
模型上的外键就是 post_id
。
一旦关系被定义好以后,就可以通过访问 Post
模型的 comments
属性来获取评论的集合。记住,由于 Eloquent 提供了「动态属性,因此我们可以像访问模型的属性一样访问关联方法:
$comments = App\Models\Post::find(1)->comments;
foreach ($comments as $comment) {
//
}
当然,由于所有的关联还可以作为查询语句构造器使用,因此你可以使用链式调用的方式,在 comments
方法上添加额外的约束条件:
$comment = App\Models\Post::find(1)->comments()->where('title', 'foo')->first();
正如 hasOne
方法一样,你也可以通过向 hasMany
方法传递附加参数来覆盖默认的外键和本地键:
return $this->hasMany('App\Models\Comment', 'foreign_key');
return $this->hasMany('App\Models\Comment', 'foreign_key', 'local_key');