laravel中with、has、whereHas、withCount
-
laravel中with()方法,has()方法和whereHas()方法的区别
-
with()方法是用作“渴求式加载”
-
User::has('post')->get()获取至少有一条post的User数据
-
whereHas
-
Laravel 中 withCount() 建立一对一、一对多关系
-
laravel ORM with 用法
laravel中with()方法,has()方法和whereHas()方法的区别
with()方法是用作“渴求式加载”
with()方法是用作“渴求式加载”的,那主要意味着,laravel将会伴随着主要模型预加载出确切的的关联关系。
这就对那些如果你想加在一个模型的所有关联关系非常有帮助。因为“渴求式加载”缓解了1+N的查询问题,仅需1+1次查询就能解决问题,对查询速度有了质的提升。
例如:
user > hasMany > post
$users = User::with('posts')->get();
foreach($users as $user){
$users->posts; // posts已经被加载了,没有增加DB查询
}
User::has(‘post’)->get()获取至少有一条post的User数据
has()方法是基于关联关系去过滤模型的查询结果,所以它的作用和where条件非常相似。
如果你只使用has(‘post’),这表示你只想得到这个模型,这个模型的至少存在一个post的关联关系。
例如:
user -> hasMany -> post
//User至少有一条post的关联关系
$users = User::has('post')->get();
获取至少有一条post的User数据
你还可以使用”.“来构造嵌套has语句。
例如:
user -> hasMany -> post
$user = User::has('post.votes', ‘>’, '3')->get();
whereHas
whereHas()方法的原理基本和has()方法相同,但是他允许你自己添加对这个模型的过滤条件。
例如:
user -> hasMany -> post
$users = User::whereHas('posts', function($q){
$q->where('created_at', '>=', '2020-11-29');
})->get();
// 只返回用户的post记录在2020年11月29之后的数据
Laravel 中 withCount() 建立一对一、一对多关系
比如:
我有一张学生表,一张课程表,一张班主任表。一个学生对应了一个班主任,一个学生对应了多个课程。
我想通过学生表,用 withCount 连接两张表,计算出该学生的课程数量和班主任数量。
原料:
准备好三张表的模型代码文件。建立学生与课程老师的关联关系,且方法名和 withCount 里面名字一样。
举例:
学生模型 Student.php 模型中定义方法,与课程建立一对多关系
public function course(){
return $this->hasMany(Course::class, 'student_id', 'id')->orderBy('created_at', 'desc');
}
学生模型 Student.php 模型中定义方法,与老师建立一对一关系
public function teacher(){
return $this->hasOne(Teacher::class, 'id', 'teacher_id');
}
定义完毕后,就可以把模型中定义的方法名以数组形式传入 withCount() 中了。
$students = Student::orderBy('created_at', 'desc')->withCount(["course","teacher"])->paginate(10);
模版中,结果以 定义的方法名字+“_count” 组合的字段显示。这里是 course_count 和 teacher_count。
laravel ORM with 用法
$builder = UserMechanicDataVerify::query();
$builder->with( [ 'user' => function($query) use ($mobile){
$query->select('id', 'mobile');
$query->with( ['mechanic' => function($query){
$query->select('uid', 'realname');
}] );
}] );
if(!empty($mobile)){
$builder->Join('duser', function($join) use ($mobile) {
$join->on('duser.id', '=', 'user_mechanic_data_verify.uid');
$join->where('duser.mobile', 'like', '%'. $mobile.'%');
});
}