PHP Yii1.1框架下如何查询oncallduty为真的用户手机号与用户名
Yii 1.x 关联表查询值班用户信息代码修复方案
原有代码存在的问题
- 关联声明错误:
$criteria->with仅支持传入模型中已定义的关联关系名称,不能直接传入实例化的UserHasTeam对象 - 条件逻辑错误:
addCondition内使用单等号=属于赋值操作,不是判断逻辑,且关联表字段引用方式错误 - 查询范围错误:
find()仅会返回第一条符合条件的记录,要查询所有符合条件的值班用户需要用findAll() - 入参冗余:方法接收的
$name参数未被使用,可根据实际业务需求调整逻辑 - 输出不规范:接口直接拼接输出字段,未做格式处理和空值判断,容易报错且不利于调用方解析
修复后代码
public function actionGetPhone($name = '') { $criteria = new CDbCriteria(); // with参数填写User模型中定义的关联关系名称,这里假设和UserHasTeam的关联名为userHasTeam $criteria->with = array('teams', 'userHasTeam'); $criteria->together = true; // 正确的条件写法,关联表字段用「关联名.字段名」格式引用 $criteria->addCondition('userHasTeam.oncallduty = 1'); // 查询所有符合条件的用户 $models = User::model()->findAll($criteria); Yii::log(print_r($models, true)); // 组装返回结果 $result = []; foreach ($models as $model) { $result[] = [ 'username' => $model->username, 'mobile' => $model->mobile ]; } // 输出JSON格式响应,适配接口调用场景 echo CJSON::encode($result); Yii::app()->end(); }
补充注意事项
如果你的User模型还没有定义和UserHasTeam的关联关系,需要先在User模型的
relations()方法中添加对应配置,示例如下:public function relations() { return array( 'userHasTeam' => array(self::HAS_MANY, 'UserHasTeam', 'user_id'), 'teams' => array(self::MANY_MANY, 'Team', 'user_has_team(user_id, team_id)'), ); }
- 如果业务仅需要获取单个值班用户,可保留原
find()方法,需要新增空结果判断逻辑,避免访问不存在的属性报错 - 建议给接口增加权限校验逻辑,避免用户手机号等敏感信息泄露
内容的提问来源于stack exchange,提问作者Malgosh
相关产品推荐
相关产品推荐

