tp5 关联查询总结

浏览:16836 发布日期:2017/05/27 分类:技术分享 关键字: thinkPHP5 关联查询 with
最近写代码翻手册较多,对关联查询有点豁然开朗的感觉,记录再此,并作分享。
先说版本,摘自手册。
版本 功能调整
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.关联查询要操作关联表的,用闭包,上边有例子,参数就是那么传的。
重点:表述如有失误,欢迎指出,立马更正。共同学习,共同进步。谢谢!
最佳答案
评论() 相关
后面还有条评论,点击查看>>