在 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();
近期评论