有時(shí)候,在A表左連B表的時(shí)候,需要先在B表中過(guò)濾一些數(shù)據(jù),我們想要生成的語(yǔ)句如下:
SELECT ,
s
.,sl.level_id as level_id,l.name as l_name FROMA
s
LEFT JOINB
sl
ONsl
.student_id
=s
.id
ANDsl
.is_current
=1
這個(gè)語(yǔ)句的效果就是在B表中過(guò)濾is_current不等于1的數(shù)據(jù),然后在進(jìn)行關(guān)聯(lián),這樣的好處是left join就能返回左表A的全部行數(shù)。若是語(yǔ)句如下面這樣:
SELECT ,
s
.,sl.level_id as level_id,l.name as l_name FROMA
s
LEFT JOINB
sl
ONsl
.student_id
=s
.id
wheresl
.is_current
=1
則這樣的效果就等同于inner join,返回的數(shù)據(jù)就是A表和B表連接查詢(xún)后生成的臨時(shí)表,然后再過(guò)濾is_current這個(gè)條件,導(dǎo)致不能達(dá)到left join的效果。
下面我們來(lái)展示下tp5.1中該如何達(dá)到該效果:
首先,假定已經(jīng)為A和B表生成了模型,那我們可以這樣用:
ADb::alias('A') ->leftJoin("$BTableName B", ['A.student_id=B.id', 'B.is_current=1']);
注:作用體現(xiàn)在A和B表,在如果不限定B表的is_current時(shí)是一對(duì)多的關(guān)系,
所以需要先過(guò)濾掉B表的is_current不滿(mǎn)足的數(shù)據(jù)。