📅  最后修改于: 2023-12-03 15:02:34.851000             🧑  作者: Mango
在 Laravel 中,Eloquent 提供了 hasMany
方法用于定义一个模型与多个其它模型之间的一对多关系。使用 hasMany
方法,可以定义一个模型与其它模型的关系,并且能够轻松地查询、保存及删除这些关联模型。
定义 hasMany
关联关系,需要在模型中编写方法,如下所示:
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
class Post extends Model
{
/**
* 获取该文章下的所有评论
*/
public function comments()
{
return $this->hasMany(Comment::class);
}
}
通过在关联方法中调用 hasMany
方法,可以指定关联的模型,如上面的例子中,关联的模型为 Comment
。
当模型定义了 hasMany
关联方法后,可以通过使用 with
方法来预加载关联模型,以避免在之后的查询中出现 N + 1 问题,如下所示:
$posts = App\Models\Post::with('comments')->get();
foreach ($posts as $post) {
// 访问预载入的 comments 关联关系
foreach ($post->comments as $comment) {
//
}
}
使用 with
方法定义要预加载的关联关系以及它们的名称,方法的参数是关系名称,可以链式调用多个关系名进行预加载。
当预加载关联关系时,有时只需选择关联模型的特定字段,可以在 with
方法中传递一个闭包,来定义要选择的字段,如下所示:
$posts = App\Models\Post::with(['comments' => function ($query) {
$query->select('id', 'post_id', 'body');
}])->get();
这里,我们传递了一个闭包,将要预加载的关联关系以及关联关系的名称 comments
指定为 with
方法的参数。在闭包中,我们使用 select
方法来定义要选择的字段:id
, post_id
以及 body
。在查询中,只有这三个字段将被选择。
有时,我们需要对关联的模型进行进一步筛选,可以在关联方法中传递参数,在关联查询中添加额外的限制条件,如下所示:
public function comments()
{
return $this->hasMany(Comment::class)->where('status', 1);
}
这里,我们在关联查询中添加了一个限制条件,只获取 status
值等于 1 的评论。在使用 with
方法预加载关联时,只有关联模型满足限制条件的记录才会被选择。
使用 hasMany
方法,您可以在 Laravel 应用程序中轻松地定义一个模型与多个其它模型之间的一对多关系。它允许您预加载关联关系,选择特定的关联字段以及对相关模型进行筛选。在使用这个方法时,记住优化性能,避免出现 N + 1 问题以及选择合适的选择特定字段。