关于laravelDb的whereHas的疑问

chuxinone

问题描述

Laravel 的关联关系查询 whereHas 在日常开发中给我们带来了极大的便利,但是在主表数据量比较多的时候会有比较严重的性能问题,主要是因为 whereHas 用了 where exists (select * ...),之前使用laravel的时候会使用https://learnku.com/articles/68975 这个包来进行改善,但是在webman中我使用了这个包后出现了不适配的情况,比如最终的sql语句中的in等条件会被当成where字符串条件等错误,不知在webman中是否有whereHas的改善包或方案

337 2 0
2个回答

meows

怎么可能会有,你那个本身就是人家扩展的,你自己修改下吧

  • 暂无评论
caylof

首先,exist 和 in 的执行效率比较没有定性的结果,具体情况需要 explain 下。

如果非要用 in 来替换 exist 语句,自己可以完全用 Eloquent 重组构建想要的 sql,简单举例下:

表 user 与 card 是一对多的关系

$sql1 = User::query()->whereHas('card')->toSql();

$sql2 = User::query()->whereIn('id', Card::query()
    ->select('user_id')
    ->whereColumn('user.id', 'card.user_id')
)->toSql();
  • chuxinone 2023-11-10

    这种方式我还没尝试,请问下大佬,user和card以及group三个表分别都是1对1的关系,现在我通过user入口表来进行关联查询,最终结果只想返回3个表都有匹配结果的数据,如果某一个表没有找到匹配的数据则该条数据不返回,我目前是通过join来进行查询的,按照你这种方法是否适用我上列情况

  • caylof 2023-11-13

    适用的,可以构建你想要的任意 sql

🔝