はじめに
クエリビルダで、サブクエリを使い取得していたデータを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")