【问题标题】:Yii2: Restful API Create & Update with relationsYii2:Restful API 创建和更新关系
【发布时间】:2016-04-07 01:17:34
【问题描述】:

我的 RESTful API 需要存储来自 JSON POST/PUT 请求的关系数据:

地址表通过表addresscategory_assignment有很多类别:

public function getAddresscategories() 
{
   return $this->hasMany(TblAddresscategory::className(), ['id' => 'addresscategory_id'])
                ->viaTable('tbl_addresscategory_assignment', ['address_id' => 'id']); 
}

读取和保存关系数据的最佳方式是什么?

Yii2 仅在 GET 请求中支持关系 REST,但在 POST/PUT 中不支持。

通过 REST PUT 传入的地址 JSON:

{
    "id": 1,
    "name": "Miller",

    "addresscategories": [
        {
            "id": 9,
            "categories": "customer"
        },
        {
            "id": 10,
            "gruppe": "reseller"
        }
    ]
}

addresscategories 已经存在,我只需要读取关系并将它们存储到 tbl_addresscategory_assignment

【问题讨论】:

    标签: php rest yii2


    【解决方案1】:

    一种方法可能是将 EVENT_AFTER_INSERT 的活动记录事件附加到要在其上创建新条目的模型。然后,从post/put中插入数据后,就可以根据刚刚插入的模型ID创建赋值关系了。

    事件允许您在不破坏内置 REST url 结构的情况下处理数据

    这是一个不知道表结构的简单示例...

    public function init()
    {
        $this->on(ActiveRecord::EVENT_AFTER_INSERT, function ($event) {
    
            // Category ID just created
            $firstid = $event->sender->id;
    
            // Whatever the second ID is
            $secondid = 999;
    
            $assignment = new CategoryAssignment;
            $assignment->setAttribute('firstid', $firstid);
            $assignment->setAttribute('secondid', $secondid);
            $assignment->save();
        }
    }
    

    【讨论】:

      【解决方案2】:

      您可以查看this post 讨论 RESTful API 中的多对多关系。关于执行此操作的最佳方法有很多讨论,但这实际上取决于哪种方法最适合您的应用程序。

      对于多对多关系,我倾向于为关系本身创建一个资源,在您的情况下是一个 addresscategory_assignment 资源。这将代表您的 tbl_addresscategory_assignment 表中的条目,看起来像这样:

      GET http://my.api/relationships/addresscategory_assignment
      
      {
          table_id: 6,
          address_id: 15
          category_id: 2
      }
      

      以这种方式公开关系有几个优点:

      1. 您可以使用此资源轻松创建/更新多对多关系。
      2. 如果您添加某种非活动/软删除字段,您可以停用旧关系并保留关系历史记录,这可能对您很重要,也可能不重要。
      3. 除非您正在创建/更新,否则您真的可以忽略这些关系资源。您可以使用 Yii 在模型中的关系方法和 extraFields 方法加上 expand GET 参数来获取相关对象。

      缺点是现在有额外的资源,您经常需要进行一两次额外的 API 调用才能完成工作。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-01-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-05-29
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多