Modo corretto descritto in questa risposta: https://stackoverflow.com/a/52772444/2519714
La risposta più popolare al momento attuale non è del tutto corretta.
In questo modo https://stackoverflow.com/a/24838367/2519714 non è corretto in alcuni casi come: sub select ha i collegamenti dove, quindi unendo la tabella alla sottoselezione, quindi altri luoghi aggiunti a tutte le query. Ad esempio query:
select * from (select * from t1 where col1 = ?) join t2 on col1 = col2 and col3 = ? where t2.col4 = ?
per fare questa query scriverai codice come:
$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');
Durante l'esecuzione di questa query, il suo metodo $query->getBindings()
restituirà i collegamenti in un ordine errato come ['val3', 'val1', 'val4']
in questo caso invece corretto ['val1', 'val3', 'val4']
per sql grezzo descritto sopra.
Ancora una volta il modo corretto per farlo:
$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');
Anche i collegamenti verranno automaticamente e correttamente uniti alla nuova query.
belongsToMany
come sottoselezione devi aggiungeregetQuery()
due volte =>$sub->getQuery()->getQuery()