Проблема с поиском по атрибутам связной таблицы с группировкой результата

Всё что касается построения API
Ответить
pioneer
Сообщения: 136
Зарегистрирован: 2013.03.10, 23:27

Проблема с поиском по атрибутам связной таблицы с группировкой результата

Сообщение pioneer »

Всем доброго времени суток!
Пишу REST API, есть 2 модели - Category & Product со связью многие-ко-многим (через промежуточную таблицу, т.е. один товар может быть привязан сразу к нескольким категориям).
Задачка простенькая - реализовать поиск по имени товара и отдавать сгруппированный по категориям результат.
В экшене делаю следующее:

Код: Выделить всё

public function actionSearchProductsByTerm()
{
    if (Yii::$app->request->get('term')) {
        return new ActiveDataProvider([
            'query' => Category::find()
                ->with([
                    'products' => function ($query) {
                        /** @var $query yii\db\ActiveQuery */
                        $query->andWhere(['like', 'name', Yii::$app->request->get('term')]);
                    }
                ]),
            'pagination' => [
                'pageSize' => 50,
            ],
        ]);
    } else {
        throw new BadRequestHttpException('Missing term parameter in request');
    }
}
в ответ на мой запрос на api.my-site.loc/v1/searchProductsByTerm?term=iphone&expand=products результат выходит вот такой:

Код: Выделить всё

{
  "success": true,
  "data": {
    "items": [
      {
        "id": 2,
        "name": "Техника Apple",
        "url": null,
        "products": []
      },
      {
        "id": 3,
        "name": "Смартфоны Apple",
        "url": null,
        "products": []
      },
      {
        "id": 4,
        "name": "Планшеты Apple",
        "url": null,
        "products": []
      },
      {
        "id": 5,
        "name": "Ноутбуки Apple",
        "url": null,
        "products": []
      }
    ],
    "_links": {
      "self": {
        "href": "http://api.my-site.loc/v1/searchProductsByTerm?term=iphone&expand=products&page=1&per-page=50"
      },
      "first": {
        "href": "http://api.my-site.loc/v1/searchProductsByTerm?term=iphone&expand=products&page=1&per-page=50"
      },
      "last": {
        "href": "http://api.my-site.loc/v1/searchProductsByTerm?term=iphone&expand=products&page=1&per-page=50"
      }
    },
    "_meta": {
      "totalCount": 4,
      "pageCount": 1,
      "currentPage": 1,
      "perPage": 50
    }
  }
}
вопрос: почему выводится список из всех категорий на сайте, а не только тех в которых содержатся товары с name LIKE '%iphone%' (при этом массив товаров почему-то везде пустой)? что я упустил? и ещё вопрос: можно ли как-нибудь отдавать массив товаров products по умолчанию, чтобы не указывать каждый раз expand=products (т.к. для этого API метода это излишне, поскольку поиск всегда будет выполняться по атрибутам товара).

всем откликнувшимся и неравнодушным заранее спасибо! :)
Ответить