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.'%');
});
}


成功解决AttributeError: 'BasicLSTMCell' object has no attribute '_kernel'+python下划线用法的几种常见用法理解

成功解决AttributeError: 'BasicLSTMCell' object has no attribute '_kernel'+python下划线用法的几种常见用法理解 目录解决问题解决思路解决方法   解决问题AttributeError: 'BasicLSTMCell' object has no attribute '_kernel'  解决思路P

java sql文档 java sql in

记录一下。需要在java中写sql语句,正好需要in的条件。本来使用的是如下代码。public static void main(String[] args) { List<String> list = new ArrayList<>(); list.add("zxt"); list.add("lan");

java session 跨域 java跨域请求的三种方法

默认情况下服务端是不允许ajax跨域访问的,需要在response头设置相应的跨域权限在后台,常用的配置跨域有两种方式1、配置Filter过滤器(拦截器也可以):@WebFilter("/test") public class CorsFilter implements Filter { @Override public void doFilter(ServletRequest