最近有使用TP开发。对->with和->withJoin这样的关联预载入感到不解,现记录总结如下:
关联查询的预查询载入功能,解决了性能与查询的之间的最优化选择问题,主要解决了N+1次查询的问题,这里举一个例子,查询3个结果,会进行4次查询。
如果使用关联预查询功能,对于一对一关联来说,只有一次查询,对于一对多关联的话,就可以变成2次查询,有效提高性能。
也可以支持嵌套预载入,例如:
V5.0.7版本以上,支持使用数组方式定义嵌套预载入,例如下面的预载入要同时获取用户的Profile关联模型的Phone、Job和Img子关联模型数据:
如果要指定属性查询,可以使用闭包查询:
V5.0.4+版本开始一对一关联预载入支持两种方式:JOIN方式(一次查询)和IN方式(两次查询),如果要使用IN方式关联预载入,在关联定义方法中添加
有些情况下,需要根据查询出来的数据来决定是否需要使用关联预载入,当然关联查询本身就能解决这个问题,因为关联查询是惰性的,不过用预载入的理由也很明显,性能具有优势。
延迟预载入仅针对多个数据的查询,因为单个数据的查询用延迟预载入和关联惰性查询没有任何区别,所以不需要使用延迟预载入。
如果你的数据集查询返回的是数据集对象,可以使用调用数据集对象的load实现延迟预载入:
如果你的数据集查询返回的是数组,系统提供了一个load_relation助手函数可以完成同样的功能。
我在项目中,碰到的问题就是,定义了模型中的关联:
使用->with预查询,但是查询出来的结果集有问题,打印SQL语句发现是默认用的INNER JOIN,而我应该用LEFT JOIN,经总结,在blongsto中第五个参数是关联方式,改为LEFT即可