二.关联查询
- 前几篇博文,了解了三种基础的关联模型,并简单的进行查询;
- 本节课,我们详细的了解更多的查询方案;
//下面两种查询是一样的;
$books = User::find(19)->book;
$books = User::find(19)->book()->get();
//可以采用 where 筛选或闭包
$books = User::find(19)->book() ->where('id', 1)->orWhere('id', 11)->get();
$books = User::find(10)->book()->where(function ($query) { $query->where('id', 1)->orWhere('id', 11);
})->get();
- 使用 has()方法,可以查询某些条件下的关联查询数据;
//获取存在关联书籍的用户列表(言下之意:至少一本书)
$users = User::has('book')->get();
return $users;
//获取存在关联书籍(并超过 3 条)的用户列表
$users = User::has(‘book’,’>=’, 3)->get();
return $users;
- 使用 whereHas()方法,创建闭包查询;
//whereHas 闭包用法
$users = User::whereHas('book', function ($query) { //这里$query 是 book 表,通过 user_id 查询,返回 user 表数据 $query->where('user_id', 19); })->get();
return $users;
- 使用 doesntHave()方法,即 has()的反向操作;
//获取不存在关联书籍的用户列表,闭包用法:whereDoesntHave()
$users = User::doesntHave('book')->get();
return $users;
- 使用 withCount()方法,可以进行关联统计;
//关联统计,会自动给一个 book_count 字段
//统计每个用户有多少本书
$users = User::withCount('book')->get();
return $users;
//给多个关系添加统计:profile_count,book_count
$users = User::withCount(['profile', 'book'])->get();
return $users;
//关联统计再结合闭包进行筛选,还可以设置别名
$users = User::withCount(['profile', 'book' => function ($query) { //这里限制被统计的记录 $query->where('user_id', 19); }])->get(); return $users;