如何获取特定字段或更新主题并从yii2 REST API中的api调用中获取关系fildes?

时间:2016-08-10 17:15:08

标签: rest yii2

我尝试默认yii2 api休息调用GET获取一些模型字段或PUT更新某些模型字段但我无法找到实现此目的的方法。我只能获得所有字段或更新主题。有没有帮助呢?我如何获得该模型的相关关系字段?

我像这样尝试

GET localhost/my-website-name/api/web/v1/vendors/
PUT localhost/my-website-name/api/web/v1/vendors/1

3 个答案:

答案 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)

您好我能找到适合这种情况的解决方案

  1. 首先获取一些模型字段并使用相关实体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);
        }
     ];
    }
    
  2. 如果你想删除一些fildes

    public function fields()
    {
      $fields=parent::fields();
      unset($fields['id']);
      return $fields;
    }
    
  3. 仅更新特定字段

    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
    }