Yii2模型关联查询:获取关联表存在对应记录的Truck数据
解决方法:获取存在关联检查记录的卡车数据
嘿,这个需求其实很好实现,你当前用了leftJoin但需要过滤出在tbl_checks中有对应记录的tbl_truck数据,这里有几种常用的靠谱方案:
方案1:改用内连接(INNER JOIN)
这是最直接高效的方式,因为内连接本身就只会返回两张表中匹配关联条件的记录,自动过滤掉没有对应检查记录的卡车:
$query = TblTrucksModel::find()->innerJoin('tbl_checks','tbl_trucks.id = tbl_checks.truck_id');
这种方式的性能最优,数据库不需要先执行左连接拉取所有数据再过滤,推荐优先使用。
方案2:左连接后添加非空过滤条件
如果你因为某些原因必须保留左连接的写法(比如后续需要用到tbl_checks的字段但要过滤无匹配的记录),可以通过判断tbl_checks的字段不为NULL来过滤:
// 方式A:用Yii的数组式where(更安全,防SQL注入) $query = TblTrucksModel::find() ->leftJoin('tbl_checks','tbl_trucks.id = tbl_checks.truck_id') ->where(['not', ['tbl_checks.id' => null]]); // 方式B:直接写SQL条件 $query = TblTrucksModel::find() ->leftJoin('tbl_checks','tbl_trucks.id = tbl_checks.truck_id') ->where('tbl_checks.truck_id IS NOT NULL');
左连接中没有匹配的记录会让tbl_checks的所有字段为NULL,所以只要判断其中一个必存在的字段(比如id或truck_id)不为空即可。
方案3:使用EXISTS子查询
这种写法语义更清晰,直接表达“存在对应检查记录”的逻辑,在数据量较大时,数据库优化器可能会给出更优的执行计划:
$query = TblTrucksModel::find() ->where(['exists', TblChecksModel::find()->where(['truck_id' => new \yii\db\Expression('tbl_trucks.id')])]);
这里用\yii\db\Expression来引用主查询的tbl_trucks.id字段,实现关联子查询的判断。
内容的提问来源于stack exchange,提问作者Geoff
相关产品推荐
相关产品推荐

