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更高效?

最美的不是下雨天,而是和你一起躲过的屋檐!
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
最佳答案

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年前 评论

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