La manière correcte décrite dans cette réponse: https://stackoverflow.com/a/52772444/2519714
La réponse la plus populaire à l'heure actuelle n'est pas totalement correcte.
De cette façon, https://stackoverflow.com/a/24838367/2519714 n'est pas correct dans certains cas comme: la sélection de sous a où les liaisons, puis la jonction de la table à la sous-sélection, puis d'autres endroits ajoutés à toutes les requêtes. Par exemple, requête:
select * from (select * from t1 where col1 = ?) join t2 on col1 = col2 and col3 = ? where t2.col4 = ?
Pour effectuer cette requête, vous allez écrire du code comme:
$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');
Pendant l'exécution de cette requête, sa méthode $query->getBindings()
retournera les liaisons dans un ordre incorrect comme ['val3', 'val1', 'val4']
dans ce cas plutôt correct ['val1', 'val3', 'val4']
pour le SQL brut décrit ci-dessus.
Encore une façon correcte de le faire:
$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');
Les liaisons seront également automatiquement et correctement fusionnées avec la nouvelle requête.
belongsToMany
sous-sélection, vous devez ajoutergetQuery()
deux fois =>$sub->getQuery()->getQuery()