我还有其他 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'];
}
...