3
0

More than 1 year has passed since last update.

laravelでエイリアスのついたカラムをorderByするのに詰まった

Posted at

はじめに

クエリビルダで、サブクエリを使い取得していたデータをorderByしようとしたところ下記エラーが発生。

SQLSTATE[42S22]: Column not found: 1054 Unknown column

カラムがないと怒られてしまったので解決方法忘れないように記載。
laravelのVerは8.8

成功したやぁつ

hogeModel.php
public function getHoge($request)
{
    $sort = $request->sort;
    $direction = $request->direction;
    $page = $request->page ?? 1;

    $join = Table2::select('table2.table1_id', 'table2.created_at')
            ->whereNotIn('table2s.status', ["aaa", "bbb"]);
    $sql =
        DB::table('table1')
            ->leftJoin(DB::raw("({$join->toSql()}) as t2"), 'table1.id', '=', 'table2.table1_id')
            ->mergeBindings($join->getQuery())
            ->select(
                'table1.id', 'table1.name', 'shop_plans.plan_name'
            )
            ->addSelect(DB::raw('MAX(t2.created_at) AS latest_t2_created'));
    //この部分
    $sql->orderByRaw("MAX(o.created_at) {$direction}");

    $onePageCount = 20;

    $sql = $sql
            ->orderBy('table1.id', 'desc')
            ->skip($onePageCount * ($page - 1))
            ->take($onePageCount)
            ->paginate($onePageCount)->withQueryString();

    return $sql;
}

ダメだったやぁつ

hogeModel.php
public function getHoge($request)
{
    $sort = $request->sort;
    $direction = $request->direction;
    $page = $request->page ?? 1;

    $join = Table2::select('table2.table1_id', 'table2.created_at')
            ->whereNotIn('table2s.status', ["aaa", "bbb"]);
    $sql =
        DB::table('table1')
            ->leftJoin(DB::raw("({$join->toSql()}) as t2"), 'table1.id', '=', 'table2.table1_id')
            ->mergeBindings($join->getQuery())
            ->select(
                'table1.id', 'table1.name', 'shop_plans.plan_name'
            )
            ->addSelect(DB::raw('MAX(t2.created_at) AS latest_t2_created'));
    //この部分
    $sql->orderBy("MAX(o.created_at) {$direction}");

    $onePageCount = 20;

    $sql = $sql
            ->orderBy('table1.id', 'desc')
            ->skip($onePageCount * ($page - 1))
            ->take($onePageCount)
            ->paginate($onePageCount)->withQueryString();

    return $sql;
}

結論

orderBy('column', 'asc')という書き方ではダメで
orderByRaw("column asc")を使えばいける。

なお$directionを変数展開するので、シングルクォーテーションではなくダブルクォーテーションにしなければいけないのも忘れちゃいけないポイント(基本はシングルで書いてます、何やら処理速度がシングルの方が早いのだとか)

追記

もしかしたらバッククォートで囲えばいけるかもしれないが実際には試していない

->orderBy("`latest_t2_created` asc")
3
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
0