Yii2:Restful API Create&更新关系

时间:2014-11-13 11:43:22

标签: php rest yii2

我的 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"
        }
    ]
}

地址类别已经存在,我只需要阅读关系并将它们存储到tbl_addresscategory_assignment

2 个答案:

答案 0 :(得分:0)

一种方法可能是将 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();
    }
}

答案 1 :(得分:0)

您可以结帐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参数来获取相关对象。
  4. 缺点是现在有额外的资源,你经常需要额外的一两个API调用才能完成任务。