You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 04:36:07