Правильний спосіб, описаний у цій відповіді: https://stackoverflow.com/a/52772444/2519714
Найпопулярніша відповідь на даний момент не зовсім правильна.
Цей спосіб https://stackoverflow.com/a/24838367/2519714 в деяких випадках є неправильним, наприклад: sub select має де прив'язки, потім приєднання таблиці до підвибору, а потім інші місця, додані до всіх запитів. Наприклад, запит:
select * from (select * from t1 where col1 = ?) join t2 on col1 = col2 and col3 = ? where t2.col4 = ?
Для цього запиту ви напишете такий код:
$subQuery = DB::query()->from('t1')->where('t1.col1', 'val1');
$query = DB::query()->from(DB::raw('('. $subQuery->toSql() . ') AS subquery'))
->mergeBindings($subQuery->getBindings());
$query->join('t2', function(JoinClause $join) {
$join->on('subquery.col1', 't2.col2');
$join->where('t2.col3', 'val3');
})->where('t2.col4', 'val4');
Під час виконання цього запиту його метод $query->getBindings()
повертає прив'язки в неправильному порядку, як ['val3', 'val1', 'val4']
у цьому випадку, замість правильного ['val1', 'val3', 'val4']
для raw sql, описаного вище.
Ще раз правильний спосіб зробити це:
$subQuery = DB::query()->from('t1')->where('t1.col1', 'val1');
$query = DB::query()->fromSub($subQuery, 'subquery');
$query->join('t2', function(JoinClause $join) {
$join->on('subquery.col1', 't2.col2');
$join->where('t2.col3', 'val3');
})->where('t2.col4', 'val4');
Також прив'язки будуть автоматично і правильно об'єднані з новим запитом.
belongsToMany
підвибір, вам доведеться додатиgetQuery()
двічі =>$sub->getQuery()->getQuery()