😽

クエリビルダーで既にjoinしたかどうかを調べる方法(laravel)

2021/10/11に公開

クエリビルダーで検索機能をつけたり少し複雑な動きをする場合に、「まだjoinしてない場合はここでjoinする!」っていう動きをつけたい時がありました。

そんな時は、これ!
※必要に応じてメソッドをpublicにしたりしてください。

private function isJoined($query, $table)
{
    $joins = collect($query->getQuery()->joins);
    return $joins->pluck('table')->contains($table);
}

これをどのように使用するかというと

$query = User::query();

.
.
.

if (!$this->isJoined($query, "articles")) {
    $query->join("articles", "articles.user_id", "=", "users.id");
}

$users = $query->get();

先ほど紹介したisJoinメソッドを使用してまだjoinされていない場合は、joinする!という動作を実現します。

今まで考えたこともなかったけど、意外複雑な処理が発生してでもなるべく速度を早めたいとなった場合(無駄なjoinを走らせたくない場合)に使えそうです。

このようなやり方は覚えておいて損はなさそうですね^^

Discussion