复合键时Yii2 REST API更新(put)

问题描述 投票:1回答:3

我试图通过Yii2框架中的PUT http请求更新我的模型。当我的模型中有单个主键时,一切正常。

问题是我在表中有复合主键。

如何更新?

我提交JSON:

{"date_execution":"2017-08-26","order_id":"59", "company_id":13,"your_price":100,"car_id":"8","note":"lorem ipsum"} 

我的复合主键包括: - order_id - company_id

我尝试了以下请求:

  • PUT SERVER / offer / 100 - 其中100是company_id
  • PUT SERVER / offer / 2000 - 其中2000是order_id

这2个请求返回问题:

{"name":"Not Found","message":"Object not found: 13","code":0,"status":404,"type":"yii\\web\\NotFoundHttpException"}

我也试过了

  • PUT SERVER / offer / 2000/100 - 其中2000是order_id,100是company_id
  • PUT SERVER / offer / 100/2000

那2个返回控制器/动作未找到异常

我还将order_id和company_id添加到JSON,但没有任何效果。

控制器类:

use yii\rest\ActiveController;
class OfferController extends ActiveController
{
    // adjust the model class to match your model
    public $modelClass = 'app\models\Offer';
    public function behaviors(){
        $behaviors = parent::behaviors();

        // remove authentication filter
        $auth = $behaviors['authenticator'];
        unset($behaviors['authenticator']);

        // add CORS filter
        $behaviors['corsFilter'] = [
                'class' => CustomCors::className()
        ];

        // re-add authentication filter
        $behaviors['authenticator'] = [
                'class' => CompositeAuth::className(),
                'authMethods' => [
                        HttpBearerAuth::className(),
                ],
        ];
        // avoid authentication on CORS-pre-flight requests (HTTP OPTIONS method)
        $behaviors['authenticator']['except'] = ['options'];

        return $behaviors;
    }
}
json rest yii2 put
3个回答
0
投票

首先需要在模型中添加primaryKey(),以覆盖ActiveRecord类的默认primaryKey()。此函数需要返回复合主键。这样你需要做什么模型

primaryKey()
{
   return array('company_id', 'order_id');
}

0
投票

如果你使用PUT SERVER / offer / 2000,100它应该工作

您可以打印模型的primaryKey()以了解键的顺序。

你可以在这里的文档https://www.yiiframework.com/doc/api/2.0/yii-rest-action中看到它

如果是复合主键,则键值将以逗号分隔。


0
投票

yii \ rest \ UpdateAction使用ActiveRecord :: findModel()方法加载数据。那些phpdoc有一个答案:

如果模型具有复合主键,则ID必须是由逗号分隔的主键值的字符串

所以正确的资源是(考虑到表结构中的第一个关键字段是company_id)

PUT SERVER/offer/100,2000
© www.soinside.com 2019 - 2024. All rights reserved.