laravel 使用with和whereHas是不是没有直接使用join高效?

1. 问题描述?

    /**
     * 关联商家
     * @return \Illuminate\Database\Eloquent\Relations\HasOne
     */
    public function merchant()
    {
        return $this->hasOne(Merchant::class, 'id', 'merchant_id');
    }

    /**
     * 查询1
     */
    public function list(array $param)
    {
        $obj = self::with(['merchant']);
        return $obj->whereHas('merchant', function ($q) use ($param) {
            if (isset($param['mobile'])) {
                $q->where('mobile', $param['mobile']);
            }
        })->get();
    }

    /**
     * 查询2
     */
    public function list2(array $param)
    {
        return DB::table('user')->join('merchant as m','m.id', '=', 'u.merchant_id')
            ->where('m.mobile','=',$param['mobile'])->get();
    }

请问查询1高效还是查询2更高效?

最美的不是下雨天,而是和你一起躲过的屋檐!
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
最佳答案

with 是单独查询 whereHas 用的是exists join 是连表

whereHas 肯定慢 因为是全表扫描

1年前 评论
Weiwen (楼主) 1年前
Smilephp (作者) 1年前
Weiwen (楼主) 1年前
Smilephp (作者) 1年前
Weiwen (楼主) 1年前
Smilephp (作者) 1年前
Weiwen (楼主) 1年前
Smilephp (作者) 1年前
Weiwen (楼主) 1年前
Smilephp (作者) 1年前
Smilephp (作者) 1年前
Weiwen (楼主) 1年前
讨论数量: 14

with 是单独查询 whereHas 用的是exists join 是连表

whereHas 肯定慢 因为是全表扫描

1年前 评论
Weiwen (楼主) 1年前
Smilephp (作者) 1年前
Weiwen (楼主) 1年前
Smilephp (作者) 1年前
Weiwen (楼主) 1年前
Smilephp (作者) 1年前
Weiwen (楼主) 1年前
Smilephp (作者) 1年前
Weiwen (楼主) 1年前
Smilephp (作者) 1年前
Smilephp (作者) 1年前
Weiwen (楼主) 1年前

是,当副表的体积过大、查询稍微复杂时,查询效率极其低下,子查询出现 dependent subquery 时 😓

之前一个接口,一些条件累计起来后,里面有不少 whereHas 查询二十多秒,后面改用 join ,降低到一秒一下。

1年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!