先说版本,摘自手册。
版本 功能调整
5.0.7 嵌套关联支持数组方式定义
5.0.5 增加延迟关联预载入
5.0.5 一对一关联预载入默认采用IN查询方式
5.0.4 一对一关联支持JOIN和IN两种方式预载入查询
join和in查询的区别很重要,注意版本。他们俩之间的区别没有做深入了解,就使用来说,关联查询从表条件的时候,in查询很是蛋疼。举个例子
A::with([
'B' => function($query) use ($b_id){
$query->where('b_id', $b_id);
}
])
->where(['a.state' => 1])
->count('a.id')这条查询在in的时候,不同的$b_id查询的结果是一样的,追溯sql如下:SELECT count(a.id) AS tp_count FROM `a` WHERE a.`state` = 1 LIMIT 1
SELECT count(a.id) AS tp_count FROM `a` WHERE a.`state` = 1 LIMIT 1
SELECT count(a.id) AS tp_count FROM `a` WHERE a.`state` = 1 LIMIT 1是很蛋疼吧,那就转join查询吧。这里就有个更蛋疼的问题了,那就是如果不是A::with开头,而是封装好的一个公共查询方法,例如:public function search() {
return self::where('state', 1);
}用这个来join查询的话,这个state有个前缀就取决于你有没有用with,用with了,必加主表前缀,没有用,必不加前缀,加了就报错。好吧,没了,基本概括完了,总结一下。
1.关联查询有join和in两种查询方式;
2.in 查询不能很好的支持关联表条件查询;
3.join 查询受制于with来考虑加不加前缀;
4.关联查询要操作关联表的,用闭包,上边有例子,参数就是那么传的。
重点:表述如有失误,欢迎指出,立马更正。共同学习,共同进步。谢谢!
最佳答案