Yii2 api 对象在 id 字段未命名 id 时未找到


Yii2 api object not found when id field not named id

我还有其他 API 在工作,但我刚刚添加了一个将 user_id 作为 id 字段而不是 id 的表,现在 api 说找不到对象。有没有办法覆盖 api 用 userinfos/1 查找的字段?

日志通常会这样说users/12

SELECT * FROM `user` WHERE `id`='12'

我收到此错误userinfos/12因为 id 实际上user_id在user_info表中:

exception 'yii'web'NotFoundHttpException' with message 'Object not found: 12' in /opt/decathletics/vendor/yiisoft/yii2/rest/Action.php:101

它应该说SELECT * FROM user_info WHERE user_id='12'但我得到上述错误

用户信息控制器.php

<?php
namespace api'modules'v1'controllers;
use Yii; 
use yii'rest'ActiveController;
use yii'filters'auth'HttpBasicAuth;
use yii'filters'VerbFilter;
use yii'filters'AccessControl;
use common'models'User;
use api'modules'v1'models'UserInfo;
class UserinfoController extends ActiveController
{
    public function behaviors()
    {
        $behaviors = parent::behaviors();
        $behaviors['authenticator'] = [
            'class' => HttpBasicAuth::className(),
        ];
        $behaviors['access'] = [
            'class' => AccessControl::className(),
            'rules' => [
                [
                    'allow' => true,
                    'roles' => ['@'],
                    'matchCallback' => function ($rule, $action) {
                        return Yii::$app->user->id == Yii::$app->request->get('id');
                    },
                    'verbs' => ['GET','PUT']
                ],
            ],
        ];
        return $behaviors;
    }
    public $modelClass = 'api'modules'v1'models'UserInfo';
}

用户信息.php模型

<?php
namespace api'modules'v1'models;
use Yii;

class UserInfo extends 'yii'db'ActiveRecord
{
    /**
     * @inheritdoc
     */
    public static function tableName()
    {
        return 'user_info';
    }
    /**
     * @inheritdoc
     */
    public function rules()
    {
        return [
            [['user_id'], 'required'],
            [['user_id'], 'integer'],
            ...
        ];
    }
    /**
     * @inheritdoc
     */
    public function attributeLabels()
    {
        return [
            'user_id' => 'User ID',
            ...
        ];
    }

}

ActiveController 将使用 yii'rest'Action::findModel($id) 根据其在数据库表中声明的模型主键获取数据。在您的情况下,您可以尝试检查数据库模式以查看user_id是否真的定义为user_info表的主键(而不是id),或者您可以尝试通过添加以下内容来手动覆盖模型的primaryKey()方法:

class UserInfo extends 'yii'db'ActiveRecord
{
  ...
  public static function primaryKey()
  {
     return ['user_id'];
  }
  ...