在 Yii2 中,使用关联查询时,报错:yii\base\ErrorException: Undefined index: id in \vendor\yiisoft\yii2\db\ActiveRelationTrait.php:554
1、在 Yii2 中,使用关联查询时,报错:yii\base\ErrorException: Undefined index: id in \vendor\yiisoft\yii2\db\ActiveRelationTrait.php:554。如图1
$query = ConventionFreeRegistration::find()
->select(ConventionFreeRegistration::tableName() . '.audit_state, COUNT(' . ConventionFreeRegistration::tableName() . '.`id`) AS `count`')
->where([
ConventionFreeRegistration::tableName() . '.convention_id' => $conventionId,
])
->groupBy(ConventionFreeRegistration::tableName() . '.audit_state')
->indexBy(ConventionFreeRegistration::tableName() . '.audit_state');
$count = $query
->joinWith(['distributor'])
->andWhere([ConventionDistributor::tableName() . '.user_id' => Yii::$app->user->id])
->asArray()
->all();
// 在模型 ConventionFreeRegistration 定义关联
public function getDistributor() {
return $this->hasOne(ConventionDistributor::class, ['convention_id' => 'convention_id', 'id' => 'distributor_id'])
->viaTable(ConventionRegistrationDistributorMapping::tableName(), ['registration_id' => 'id', 'convention_id' => 'convention_id']);
}
2、确认生成的 SQL 执行时,不会报错。如图2
3、调整代码实现,删除掉 ->asArray(),不再报错。但是,这样的话,无法获取到 count 的值。使用更可靠的替代方案,使用 leftJoin,不再报错。如图3
$query = ConventionFreeRegistration::find()
->select('t.audit_state, COUNT(t.`id`) AS `count`')
->from(ConventionFreeRegistration::tableName() . ' t')
->where([
't.convention_id' => $conventionId,
])
->groupBy('t.audit_state')
->indexBy('t.audit_state');
$count = $query
->leftJoin(
ConventionRegistrationDistributorMapping::tableName() . ' m',
't.id = m.registration_id AND t.convention_id = m.convention_id'
)
->leftJoin(
ConventionDistributor::tableName() . ' d',
'm.convention_id = d.convention_id AND m.distributor_id = d.id'
)
->andWhere(['d.user_id' => Yii::$app->user->id])
->asArray()
->all();



近期评论