有时候,在A表左连B表的时候,需要先在B表中过滤一些数据,我们想要生成的语句如下:
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
这个语句的效果就是在B表中过滤is_current不等于1的数据,然后在进行关联,这样的好处是left join就能返回左表A的全部行数。若是语句如下面这样:
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,返回的数据就是A表和B表连接查询后生成的临时表,然后再过滤is_current这个条件,导致不能达到left join的效果。
下面我们来展示下tp5.1中该如何达到该效果:
首先,假定已经为A和B表生成了模型,那我们可以这样用:
ADb::alias('A') ->leftJoin("$BTableName B", ['A.student_id=B.id', 'B.is_current=1']);
注:作用体现在A和B表,在如果不限定B表的is_current时是一对多的关系,
所以需要先过滤掉B表的is_current不满足的数据。