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

Yii2 viaTable关联查询异常:关联公司数据返回WHERE 0=1语句

问题分析与解决

出现SELECT * FROM companies WHERE 0=1的原因主要有以下几种情况,对应解决方法如下:

1. 当前News实例无有效主键ID

当你调用$news->companies时,如果当前$news对象的id字段为空(比如刚创建还未保存的News实例,或者查询时未正确获取到带ID的News记录),Yii会生成这条SQL——因为找不到对应的中间表关联记录,直接返回空集合。

解决:
确保操作的News实例是已保存到数据库的(即id不为空),比如通过News::findOne($id)获取有效实例,再调用关联。

2. 中间表无对应关联数据

如果news_companies表中不存在当前News实例id对应的news_id记录,Yii在关联查询时找不到可关联的company_id,就会生成这条SQL。

解决:
手动执行SQL验证中间表数据:

SELECT * FROM news_companies WHERE news_id = [你的News实例ID];

如果没有结果,需要补充对应的关联记录;如果有结果,再检查这些company_id是否在companies表中存在有效记录。

3. 关联定义验证(你的代码本身没问题)

你的关联代码写法是正确的:

public function getCompanies(): \yii\db\ActiveQuery
{
    return $this->hasMany(Companies::class, ['id' => 'company_id'])
        ->viaTable('news_companies', ['news_id' => 'id']);
}

viaTable的参数映射符合表结构:中间表news_companies的news_id对应News的id,companies的id对应中间表的company_id,这部分无需修改。

内容的提问来源于stack exchange,提问作者Diefair

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 22:42:09