もがき系プログラマの日常

もがき系エンジニアの勉強したこと、日常のこと、気になっている技術、備忘録などを紹介するブログです。

laravelのmergeBindings()はちょっと使いづらかった

はじめに

こんばんは。

最近laravelの mergeBindings() を使う機会がありましたが、うまく使えなかったので備忘録です。

参考サイトは以下

qiita.com

本題

条件付きのサブクエリを作る必要があったのですが自分の場合、mergeBindings()ではうまくいきませんでした。

参考サイトで紹介されている マージする順番も気をつける必要がありますので注意してください。 という話なのかな?

どんな状況になったかというと、bindingされている順番が崩れてしまいました。

そんな感じで自分が解決した方法はこちら。

private function createSubQuery(int $status, int $groupId):Builder
{
        return DB::query()
            ->select(DB::raw(<<<SELECT_COLUMNS
                users.id AS user_id,
                MAX(points.id) AS latest_point_id
            SELECT_COLUMNS))
            ->from('users')
            ->join('points', 'points.user_id', '=', 'users.id')
            ->whereRaw('users.status = ?')    ← whereではなくwhereRawで指定する
            ->whereRaw('users.groupId = ?') ← whereではなくwhereRawで指定する
            ->groupBy('users.id')
            ->setBindings([$status, $groupId]); ← mergeBindingsではなくsetBindingsを使う
}

使用する側

            $builder->joinSub($this->createSubQuery($status, $groupId, 'latest_point', static function(JoinClause $join) {
                $join->on('point.id', '=', 'latest_point.id');
            })

上記のような感じでsbuqueryをくっつければbindingの順番が崩れずにうまくSQLが構築されました。

終わりに

年始に怪我した指がやっと治ってきたと思ったら今度は風邪を引いてしまい、最近散々な僕です。

2月からは心機一転頑張りたい。