วิธีที่ถูกต้องที่อธิบายไว้ในคำตอบนี้: 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()