您当前的位置: 首页 > 

知其黑、受其白

暂无认证

  • 3浏览

    0关注

    1250博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

with、has、whereHas、withCount 用法

知其黑、受其白 发布时间:2021-05-26 18:02:26 ,浏览量:3

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.'%');
    });
}
关注
打赏
1665558895
查看更多评论
立即登录/注册

微信扫码登录

0.1315s