Laravel 的關(guān)聯(lián)關(guān)系查詢 whereHas 在日常開發(fā)中給我們帶來了極大的便利,但是在主表數(shù)據(jù)量比較多的時候會有比較嚴(yán)重的性能問題,主要是因為 whereHas 用了 where exists (select * ...),之前使用laravel的時候會使用https://learnku.com/articles/68975 這個包來進(jìn)行改善,但是在webman中我使用了這個包后出現(xiàn)了不適配的情況,比如最終的sql語句中的in等條件會被當(dāng)成where字符串條件等錯誤,不知在webman中是否有whereHas的改善包或方案
首先,exist 和 in 的執(zhí)行效率比較沒有定性的結(jié)果,具體情況需要 explain 下。
如果非要用 in 來替換 exist 語句,自己可以完全用 Eloquent 重組構(gòu)建想要的 sql,簡單舉例下:
表 user 與 card 是一對多的關(guān)系
$sql1 = User::query()->whereHas('card')->toSql();
$sql2 = User::query()->whereIn('id', Card::query()
->select('user_id')
->whereColumn('user.id', 'card.user_id')
)->toSql();