withhaswhereHaswithCount

Posted willem_chen

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了withhaswhereHaswithCount相关的知识,希望对你有一定的参考价值。

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。

以上是关于withhaswhereHaswithCount的主要内容,如果未能解决你的问题,请参考以下文章

R留学生作业代码代写代编程代编程代编程

IPEX-1代/3代/4代/5代,PCB天线底座,公头,样式及封装尺寸图

JVM 年轻代 老年代 持久代 gc

深圳本地网店代运营公司

C线程代业代写代调试POSIX Threads代编码

jvm中的年轻代 老年代 持久代 gc