इस उत्तर में वर्णित सही तरीका: 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()
गलत क्रम में बाइंडिंग लौटाएगा , जैसे कि ऊपर वर्णित कच्चे sql के लिए ['val3', 'val1', 'val4']
सही ['val1', 'val3', 'val4']
है।
ऐसा करने का एक और सही समय:
$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()