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