이 답변에 설명 된 올바른 방법 : https://stackoverflow.com/a/52772444/2519714
현재 가장 인기있는 답변은 완전히 정확하지 않습니다.
이렇게하면 https://stackoverflow.com/a/24838367/2519714 는 다음과 같은 경우에 올바르지 않습니다. 예제 쿼리 :
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']
위에서 설명한 원시 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()