我尝试默认yii2 api休息调用GET
获取一些模型字段或PUT
更新某些模型字段但我无法找到实现此目的的方法。我只能获得所有字段或更新主题。有没有帮助呢?我如何获得该模型的相关关系字段?
我像这样尝试
GET localhost/my-website-name/api/web/v1/vendors/
PUT localhost/my-website-name/api/web/v1/vendors/1
答案 0 :(得分:1)
我知道自定义字段的一种方法是覆盖模型中的字段功能,如此
public function fields() {
return [
'id',
'iso3' => function() {
return base64_encode($this->iso3);
}
];
}
答案 1 :(得分:1)
如何获取特定字段并从api调用中获取关系字段?
默认情况下,yii\db\ActiveRecord::fields()返回已从DB填充为字段的所有模型属性,而yii\db\ActiveRecord::extraFields()应返回模型关系的名称。
以此模型为例:
class Image extends ActiveRecord
{
public function attributeLabels()
{
return [
'id' => 'ID',
'owner_id' => 'Owner ID',
'name' => 'Name',
'url' => 'Url',
'created_at' => 'Created At',
'updated_at' => 'Updated At',
];
}
public function getOwner()
{
return $this->hasOne(Owner::className(), ['id' => 'owner_id']);
}
public function extraFields()
{
return ['owner'];
}
}
我在这里覆盖了 extraFields()方法来定义所有者关系。现在,如果我想要检索所有图片,但只选择 id 和名称字段,并且每个资源也应保存其相关的所有者数据,我只需要求这个网址:
GET example.com/images?fields=id,name&expand=owner
如果您想要永久删除某些字段,例如 created_at 和 updated_at ,您还可以覆盖fields()
方法:
public function fields()
{
$fields = parent::fields();
unset($fields['created_at'], $fields['updated_at'], $fields['owner_id']);
return $fields;
/*
// or could also be:
return ['id', 'name','url'];
*/
}
这样,以下请求只会返回图片的 id , name 和 url 字段以及他们的相关所有者:
GET example.com/images?expand=owner
如果所有者的字段也应该被过滤,那么在其相关类中也会覆盖其fields()
方法,或者将其绑定到图像在定义关系时使用它的模型。
有关详细信息,请参阅official documentation。
PUT更新一些模型字段
Yii只更新脏属性。所以当做:
PUT example.com/images/1 {"name": "abc"}
生成的SQL查询应该只更新数据库中id=1
的名称列。
答案 2 :(得分:0)
您好我能找到适合这种情况的解决方案
首先获取一些模型字段并使用相关实体fildes:
public function fields() {
return [
'name',
'phone_number',
'minimum_order_amount',
'time_order_open',
'time_order_close',
'delivery_fee',
'halal',
'featured',
'disable_ordering',
'delivery_duration',
'working_hours',
'longitude',
'latitude',
'image',
'owner' => function() {
$owner = Owners::findOne($this->owner_id);
return array($owner);
}
];
}
如果你想删除一些fildes
public function fields()
{
$fields=parent::fields();
unset($fields['id']);
return $fields;
}
仅更新特定字段
public function beforeSave($insert)
{
$lockedValues = ['name', 'halal', 'featured', 'latitude', 'longitude', 'image', 'status', 'created_at', 'updated_at'];
foreach ($lockedValues as $lockedValue) {
if ($this->attributes[$lockedValue] != $this->oldAttributes[$lockedValue])
throw new ForbiddenHttpException($lockedValue . " can't be changed.");
}
return parent::beforeSave($insert); // TODO: Change the autogenerated stub
}