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

时间:2017-08-24 08:43:27

标签: json rest yii2 put

我试图通过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

这两个请求正在返回问题:

{"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;
    }
}

3 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

如果您使用PUT SERVER / offer / 2000,100

,它应该可以工作

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

您可以在此处的文档中查看 https://www.yiiframework.com/doc/api/2.0/yii-rest-action

  

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

答案 2 :(得分:0)

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

  

如果模型具有复合主键,则ID必须为以下字符串:   主键值用逗号分隔

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

url