Cách đúng được mô tả trong câu trả lời này: https://stackoverflow.com/a/52772444/2519714
Câu trả lời phổ biến nhất tại thời điểm hiện tại không hoàn toàn đúng.
Cách này https://stackoverflow.com/a/24838367/2519714 không đúng trong một số trường hợp như: sub select có nơi ràng buộc, sau đó tham gia bảng để chọn phụ, sau đó thêm các wheres khác vào tất cả truy vấn. Ví dụ truy vấn:
select * from (select * from t1 where col1 = ?) join t2 on col1 = col2 and col3 = ? where t2.col4 = ?
Để thực hiện truy vấn này, bạn sẽ viết mã như:
$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');
Trong khi thực hiện truy vấn này, phương thức của anh ta $query->getBindings()
sẽ trả về các ràng buộc theo thứ tự không chính xác như ['val3', 'val1', 'val4']
trong trường hợp này thay vì đúng ['val1', 'val3', 'val4']
cho sql thô được mô tả ở trên.
Một cách chính xác nữa để làm điều này:
$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');
Ngoài ra, các ràng buộc sẽ được hợp nhất tự động và chính xác với truy vấn mới.
belongsToMany
như subselect bạn phải thêmgetQuery()
hai lần =>$sub->getQuery()->getQuery()