我试图通过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
我尝试了以下请求:
这2个请求返回问题:
{"name":"Not Found","message":"Object not found: 13","code":0,"status":404,"type":"yii\\web\\NotFoundHttpException"}
我也试过了
那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;
}
}
首先需要在模型中添加primaryKey(),以覆盖ActiveRecord类的默认primaryKey()。此函数需要返回复合主键。这样你需要做什么模型
primaryKey()
{
return array('company_id', 'order_id');
}
如果你使用PUT SERVER / offer / 2000,100它应该工作
您可以打印模型的primaryKey()以了解键的顺序。
你可以在这里的文档https://www.yiiframework.com/doc/api/2.0/yii-rest-action中看到它
如果是复合主键,则键值将以逗号分隔。
yii \ rest \ UpdateAction使用ActiveRecord :: findModel()方法加载数据。那些phpdoc有一个答案:
如果模型具有复合主键,则ID必须是由逗号分隔的主键值的字符串
所以正确的资源是(考虑到表结构中的第一个关键字段是company_id)
PUT SERVER/offer/100,2000