thinkphp5 关联预载入怎么用

时间:2024-05-23 21:50:52

最近有使用TP开发。对->with和->withJoin这样的关联预载入感到不解,现记录总结如下:

关联查询的预查询载入功能,解决了性能与查询的之间的最优化选择问题,主要解决了N+1次查询的问题,这里举一个例子,查询3个结果,会进行4次查询。

thinkphp5 关联预载入怎么用

如果使用关联预查询功能,对于一对一关联来说,只有一次查询,对于一对多关联的话,就可以变成2次查询,有效提高性能。

thinkphp5 关联预载入怎么用

也可以支持嵌套预载入,例如:

thinkphp5 关联预载入怎么用

V5.0.7版本以上,支持使用数组方式定义嵌套预载入,例如下面的预载入要同时获取用户的Profile关联模型的Phone、Job和Img子关联模型数据:

thinkphp5 关联预载入怎么用

如果要指定属性查询,可以使用闭包查询:

thinkphp5 关联预载入怎么用

 

V5.0.4+版本开始一对一关联预载入支持两种方式:JOIN方式(一次查询)和IN方式(两次查询),如果要使用IN方式关联预载入,在关联定义方法中添加

thinkphp5 关联预载入怎么用

有些情况下,需要根据查询出来的数据来决定是否需要使用关联预载入,当然关联查询本身就能解决这个问题,因为关联查询是惰性的,不过用预载入的理由也很明显,性能具有优势。

延迟预载入仅针对多个数据的查询,因为单个数据的查询用延迟预载入和关联惰性查询没有任何区别,所以不需要使用延迟预载入。

如果你的数据集查询返回的是数据集对象,可以使用调用数据集对象的load实现延迟预载入:

thinkphp5 关联预载入怎么用

如果你的数据集查询返回的是数组,系统提供了一个load_relation助手函数可以完成同样的功能。

thinkphp5 关联预载入怎么用

我在项目中,碰到的问题就是,定义了模型中的关联:

thinkphp5 关联预载入怎么用

     使用->with预查询,但是查询出来的结果集有问题,打印SQL语句发现是默认用的INNER JOIN,而我应该用LEFT JOIN,经总结,在blongsto中第五个参数是关联方式,改为LEFT即可 

thinkphp5 关联预载入怎么用