Laravel关于whereHas性能调优

Laravel关于whereHas性能调优

      最近在完成一个需求的时候用到了whereHas查询方法,发现同事也在使用这个方法,但是在本地进行调试的时候,发现速度很慢,怕上线后影响到正式环境的项目,询问同事是否有遇到这种情况,同事也说使用whereHas的时候,页面加载也很慢,所以本着性能最优的想法,网上开始查找相关的资料,最终看到了别人写的一个扩展包,并使用whereHasIn方法,自己也在本地调试发现页面加载速度确实比whereHas快,然后我去看了相关的介绍,其实他的原理就是whereIn,基于这点我又延伸使用了whereIn查询,速度确实也是挺快的,下面跟大家分享whereHasIn扩展包的使用。

      一、whereHasIn使用

      我们直接在项目目录使用composer安装即可,输入以下命令行

composer require biiiiiigmonster/hasin

安装之后便可以使用whereHasIn,不然会报错,找不到这个方法名,使用方法如下:

// whereHasIn
User::whereHasIn('posts', function ($query) {
    $query->where('votes', '>', 10);
})->get();

// orWhereHasIn
User::where('age', '>', 18)->orWhereHasIn('posts', function ($query) {
    $query->where('votes', '>', 10);
})->get();

// whereDoesntHaveIn
User::whereDoesntHaveIn('posts', function ($query) {
    $query->where('votes', '>', 10);
})->get();

// orWhereDoesntHaveIn
User::where('age', '>', 18)->orWhereDoesntHaveIn('posts', function ($query) {
    $query->where('votes', '>', 10);
})->get();

  可以参考:whereHasIn使用

      二、whereIntegerInRaw使用

      本来是要用whereIn方式进行查询的,但是whereIn绑定很多数据的会造成内存很大的损耗,但是官方文档刚好有提到这点,并用了另一个方法来代替,这一点也有说明,官方推荐使用whereIntegerInRaw方法来代替whereIn,我也使用这种,并在本地调试,效果也是很不错,从原本的20秒减少到13毫秒,关于这点可以参考官方文档:whereIn说明

      由于使用扩展包之后提交代码不是很方便,所以我是用了第二种方法,如果大家有更好解决办法,也可以在下面评论分享给大家。

0条评论

发表评论