本文详解在 yii2 框架中,根据用户所属多个团队及各团队的 `onduty` 状态,精准渲染多个条件化按钮的正确实现方式,避免因循环嵌套逻辑错位导致按钮漏显或错显。
在实际开发中,常需基于多对多关系(如用户 ↔ 团队)和关联状态(如 onDuty 字段)动态生成 UI 元素。本例中,目标是:当某用户在某个特定团队中尚未值班(onduty !== true)时,为其渲染一个专属激活按钮,且每个符合条件的团队对应一个独立按钮。
原代码的核心问题在于变量作用域与循环层级错配:$teamId 在外层 foreach ($userTeams as $teams) 中被反复覆盖,而后续查询 UserAndTeams::find() 却在循环外部执行,导致始终只使用最后一个 $teamId,最终仅生成一个(错误的)按钮。
✅ 正确做法是将关联查询 移入内层循环,确保每次迭代都针对当前团队 ID 进行独立查询与判断:
$user = User::find()
->where(['iduser' => Yii::$app->user->identity->iduser])
->one(); // 使用 one() 更合理:用户 ID 唯一,无需 all()
if ($user) {
foreach ($u
ser->teamIdteams as $teams) { // 直接遍历关联的 Team 对象
$teamId = $teams->idteam;
// 针对当前 teamId 单独查询用户-团队关联记录
$userAndTeam = UserAndTeams::find()
->where(['userid' => Yii::$app->user->identity->iduser])
->andWhere(['teamid' => $teamId])
->one(); // 同样,一对一关系用 one() 更高效
// 判断该团队下用户是否未值班
if ($userAndTeam && $userAndTeam->onduty !== true) {
echo Html::a(
'' . Html::encode($teams->name) . '',
['activate', 'id' => Yii::$app->user->identity->iduser, 'team' => $teamId],
['class' => 'btn btn-primary', 'role' => 'button']
);
}
}
}? 关键优化点说明:
? 额外建议:
遵循以上结构与实践,即可稳定、准确地为每个符合条件的团队生成独立按钮,彻底解决“只显示一个错误按钮”的问题。