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
相关产品推荐
相关产品推荐

