In yii2, when using the associated query, an error is reported: yii\base\erroreException: undefined index: id in \vendor\yiisoft\yii2\db\ActivverelationTrait.php:554
1. In yii2, when using the associated query, an error is reported: yii\base\erroreException: undefined index: id in \vendor\yiisoft\yii2\db\ActivverelationTrait.php:554. as shown in Figure 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. When confirming the generated SQL execution, there will be no errors. as shown in Figure 2
3. Adjust the code implementation, delete ->asarray(), no more errors. However, in this case, the value of count cannot be obtained. With a more reliable alternative, using leftjoin, no errors are reported. as shown in Figure 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();


