Yii2: Restful API Создание и обновление с отношениями

Мой 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 поддерживает реляционный REST только в запросе GET, но не в POST/PUT.

Адрес-JSON, который приходит через REST PUT:

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

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

Категории адресов уже существуют, мне нужно только прочитать отношения и сохранить их в tbl_addresscategory_assignment


person Fory    schedule 13.11.2014    source источник


Ответы (2)


Один из подходов может заключаться в том, что вы прикрепляете активное событие записи EVENT_AFTER_INSERT к модели, в которой вы создаете новые записи. Затем, после того как данные будут вставлены из поста/помещения, вы можете создать отношение назначения на основе идентификатора только что вставленной модели.

События позволят вам обрабатывать данные, не нарушая встроенную структуру URL-адресов REST.

Вот быстрый пример, не зная структуры таблицы...

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();
    }
}
person brdflp    schedule 19.11.2014

Вы можете проверить эту публикацию, в которой много отношений в 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 или два, чтобы что-то сделать.

person smsalisbury    schedule 06.04.2016