You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 11:35:47