Eloquent
サブクエリ
code:subquery
// fromサブクエリ使う場合に、
// グローバルスコープが複数のhoge_idのpreparedStatementのエスケープ文字を埋めにいかないから、
// グローバルスコープから除外して自分でIDを埋める必要がある。ただしscopeでメソッド化しているとちゃんと反映される
// 以下はべた書きした場合のサンプル
$sub_query = $this->model->newQuery()->withoutGlobalScope(HogeIdScope::class)
->where('hoge_id', $hoge_id)
->where('hofe_status', 1)
->orderBy('began_at', 'desc');
$sql = $sub_query->toSql();
return $this->model->newQuery()->withoutGlobalScope(HogeIdScope::class)
->from(\DB::raw("( $sql ) as hoges"))
->mergeBindings($sub_query->getQuery())->where('hoge_id', $hoge_id)->where('hogehoge', $hogehoge)->get();
追記内容
addBindings使えばGlobalScope消さなくてもOK。
mergeBindingsは同じキーだとmergeされるだけ。本来addBindingsが正しい。
INSERT SELECT
多対多リレーションの中間テーブルに大量のデータをつっこむ用途
code:insert-select
$model1 = $parent_model->child();// relation
// selectの組立て
$child_model = $model1->getModel();
$pk = $child_model->getKeyName();
$select_query = $child_model->newQuery()
->selectRaw(" $pk, $parent_model->id ");
$select = $select_query->toSql();
// modelからinsert文作るとvaluesが含まれて死ぬから、DB::insertでSQL書く(ふむ・・・
$target_table = $this->model->getTable();
\DB::insert("INSERT INTO $target_table (id, child_id) $select", $select_query->getBindings());
追記
relationからnewPivot()->newQuery()使えば中間テーブルへのQueryビルダーが取れるので、そっち使った方が良い
code:sql
select * from hoge where fuga_id in (
select id from fuga where hoge_status != "delete"
)