Laravel whereDoesntHave

whereDoesntHave 是 Laravel Eloquent 模型查询构造器中的一个方法,用于检索关联模型中没有匹配到特定条件的记录。

whereDoesntHave 的语法如下:

$query->whereDoesntHave($relation, $callback = null);

其中 $relation 表示模型之间的关系,可以是模型中定义的 hasOne、hasMany、belongsTo、belongsToMany 等关系。 $callback 表示对关联模型的进一步筛选条件,是一个回调函数,用于对关联模型的查询进行约束。

例如,假设有一个 User 模型和一个 Post 模型,它们之间是一对多的关系(即一个用户可以有多篇文章)。如果我们想要查询出所有没有发表文章的用户,可以使用 whereDoesntHave 方法:

$users = User::whereDoesntHave('posts')->get();

这个查询会返回所有没有发表文章的用户记录。

如果我们希望在这个查询中加入额外的约束条件,比如只查询那些没有发表过某个特定主题的用户,我们可以传递一个回调函数:

$users = User::whereDoesntHave('posts', function ($query) {
    $query->where('topic', 'laravel');
})->get();

这个查询会返回所有没有发表过主题为 "laravel" 的文章的用户记录。

除了使用回调函数对关联模型进行进一步筛选条件之外,whereDoesntHave 方法还支持一些其他的参数和选项,用于对查询结果进行排序、分页、限制等操作。

以下是一些常用的选项和参数:

orderBy($column, $direction = 'asc'):对查询结果按照指定字段进行排序,默认为升序排序;
take($value):限制查询结果返回的记录数量;
skip($value):设置查询结果从指定位置开始返回,通常和 take 方法一起使用实现分页效果;
withTrashed():在查询中包含已软删除的记录;
onlyTrashed():只查询已软删除的记录。

例如,我们可以对上面的例子进行排序和分页处理:

$users = User::whereDoesntHave('posts', function ($query) {
    $query->where('topic', 'laravel');
})
->orderBy('name')
->skip(10)
->take(5)
->get();

这个查询会返回跳过前 10 条记录、选择接下来的 5 条记录,并按照用户名(name)升序排序的所有没有发表过主题为 "laravel" 的文章的用户记录。

除了以上选项和参数之外,whereDoesntHave 方法还支持其他的查询构造器方法,例如 where、orWhere、whereIn、orWhereIn、whereBetween 等,可以用于进一步筛选结果。需要注意的是,在使用这些方法时需要在回调函数内部传递查询构造器对象,例如:

$users = User::whereDoesntHave('posts', function ($query) {
    $query->where('topic', 'laravel')
          ->where('published', true);
})
->orderBy('name')
->skip(10)
->take(5)
->get();

这个查询会返回所有没有发表过主题为 "laravel" 并且未发布(即 published 字段为 false)的文章的用户记录。

另外,需要注意的是,whereDoesntHave 方法只能用于查询没有关联的记录,而不能用于查询存在关联但是没有匹配到指定条件的记录。如果需要查询存在关联但是没有匹配到指定条件的记录,可以使用 whereHas 方法。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Laravel 学习交流 QQ 群:375462817 本文档前言Laravel 文档写的很好,只是新手看起来会有...
    Leonzai阅读 12,509评论 2 12
  • Laravel框架一:原理机制篇 Laravel作为在国内国外都颇为流行的PHP框架,风格优雅,其拥有自己的一些特...
    Mr_Z_Heng阅读 9,166评论 0 13
  • 问答系统 用户API Migration 1. 简介 什么是Migration呢? 是对数据表操作的一套机制 将s...
    JunChow520阅读 4,282评论 0 0
  • 校园失物招领平台开发 ——基于laravel框架构建最小内容管理系统 摘要 ​ 针对目前大学校园人口密度大、人群活...
    蓝莲花xzsky阅读 11,369评论 8 54
  • 一. 说明 以下内容大部分引用Laravel China社区的文章 - 分享下团队的开发规范 ——《Laravel...
    knghlp508阅读 12,354评论 0 28