1. 了解了三种基础的关联模型,并简单的进行查询;
2. 我们详细的了解更多的查询方案;
//下面两种查询是一样的;
$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();
3. 使用 has()方法,可以查询某些条件下的关联查询数据;
//获取存在关联书籍的用户列表(言下之意:至少一本书)
$users = User ::has( 'book ')->get();
return $users;
//获取存在关联书籍(并超过 3 条)的用户列表
$users = User ::has( 'book ', '>= ', 3)->get();
return $users;
4. 使用 whereHas()方法,创建闭包查询;
//whereHas 闭包用法
$users = User ::whereHas( 'book ', function ($query) {
//这里$query 是 book 表,通过 user_id 查询,返回 user 表数据
$query->where( 'user_id ', 19);
})->get();
return $users;
5. 使用 doesntHave()方法,即 has()的反向操作;
//获取不存在关联书籍的用户列表 ,闭包用法:whereDoesntHave()
$users = User ::doesntHave( 'book ')->get();
return $users;
6. 使用 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;