答案是:with用于预加载关联数据并可加条件筛选关联记录,不影响主模型查询结果;whereHas则用于根据关联模型条件筛选主模型记录,本质是过滤主模型。

Laravel的关联查询,说白了,就是让你能方便地从一个模型获取它相关联的数据。而要给这些关联数据加条件,最常用的手段无非就是利用
with
whereHas
要给Laravel的关联查询添加条件,我们通常有几种灵活且强大的方式。
最常见也最直接的方法,是在使用
with
where
use App\Models\User;
$usersWithPublishedPosts = User::with(['posts' => function ($query) {
$query->where('status', 'published')
->orderBy('published_at', 'desc');
}])->get();这里,
posts
status
published
User
posts
如果你想反过来,根据关联模型的条件来筛选父模型,比如,只找出那些至少有一篇“已发布”文章的用户,这时你就需要用到
whereHas
orWhereHas
use App\Models\User;
$usersWithAnyPublishedPost = User::whereHas('posts', function ($query) {
$query->where('status', 'published');
})->get();whereHas
EXISTS
use App\Models\User;
$usersAndTheirPublishedPosts = User::whereHas('posts', function ($query) {
$query->where('status', 'published');
})->with(['posts' => function ($query) {
$query->where('status', 'published'); // 这里的条件要和whereHas里的一致,否则可能出现父模型有但加载的关联为空的情况
}])->get();此外,对于一些统计类的需求,
withCount
withSum
use App\Models\User;
$usersWithPublishedPostsCount = User::withCount(['posts' => function ($query) {
$query->where('status', 'published');
}])->get();
// 此时每个User模型都会有一个published_posts_count属性最后,有时我们希望某个关联关系总是带有一些固定的条件,而不是每次查询都手动添加。这可以通过在模型中定义一个新的关系方法来实现,例如:
// 在 User 模型中
public function activePosts()
{
return $this->hasMany(Post::class)->where('is_active', true)->whereNull('deleted_at');
}
// 使用时
$user->activePosts; // 或者 User::with('activePosts')->get();这种方式是把条件“固化”在关系定义中,每次调用这个
activePosts
with
whereHas
这是个老生常谈但又特别容易混淆的问题,我个人在刚接触Laravel的时候也在这上面踩过不少坑。简单来说,它们俩的目的完全不同。
with
with
User::with(['posts' => function($q){ $q->where('status', 'published'); }])->get();User
以上就是Laravel关联查询?关联条件如何添加?的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号