本文介绍如何在 yii2 中遍历获奖者模型,关联查询对应用户和商品信息,并结构化组装为统一的 json 响应数组,避免低效的多次 arrayhelper::merge 调用。
在构建 JSON API 时,常需将多个关联模型(如获奖记录、用户资料、商品信息)聚合为扁平、语义清晰的响应结构。直接使用 ArrayHelper::merge() 在循环内反复合并对象不仅逻辑冗余,还易导致数据覆盖或类型冲突(例如两个对象含同名属性时后者覆盖前者),且无法控制字段映射关系。
更推荐的做法是主动构造目标数组结构:先获取基础数据集(如 Winners::find()->limit(8)->all()),再在 foreach 中逐条查询关联模型,并显式提取所需字段,组合成标准化的关联项。例如:
$winners = Winners::find()->limit(8)->all();
$data = []; // 初始化空数组,避免未定义警告
foreach ($winners as $winner) {
// 关联查询用户(注意:findIdentity 静态方法要求传入有效 ID,建议增加空值校验)
$user = $winner->user_id ? User::findIdentity($winner->user_id) : null;
// 关联查询本地化商品(localized() 是自定义 scope,确保 $lang 已正确定义)
$product = Products::find()
->localized($lang)
->where(['coupon' => $winner->coupon])
->one();
// 显式组装每条记录,字段命名语义明确、无歧义
$data[] = [
'id' => $winner->id,
'prize_image'=> $product ? $product->prize_image : null,
'user_name' => $user ? trim("{$user->firstname} {$user->lastname}") : 'Anonymous',
'win_title' => $product ? $product->win_title : 'N/A',
'coupon' => $winner->coupon,
'created_at' => $winner->created_at,
];
}
return $data; // 直接返回结构化数组,可被 Json::encode() 自动序列化✅ 关键优势:
⚠️ 注意事项:

此方式体现了 Yii2 “显式优于隐式”的设计哲学——不依赖通用合并工具,而是以业务语义驱动数据组装,最终产出简洁、稳定、易于维护的 API 响应。