API ресурсов Laravel для получения всех записей с предложением where ссылочной таблицы

Итак, эта проблема немного сложна, и я не знаю, нахожусь ли я вообще на правильном пути к решению.
У меня есть несколько таблиц в базе данных, которые я хочу использовать в качестве API. Я создал ресурс для таблицы, которая возвращает поля из разных таблиц.

У меня есть следующие файлы:

  • Http/Table.php (модель)
  • Http/Resources/TableResource.php (ресурс)
  • Http/Controller/Tablecontroller.php (Контроллер)
  • route/api.php (файл маршрута)

Файл ресурсов для таблицы выглядит так:

public function toArray($request)
{
    'id' => $this->id,
    'created_at' => $this->created_at,
    'updated_at' => $this->updated_at,
    'name' => $this->name,
    'website' => $this->website,
    'categories' => CategoryResource::collection($this->categories),
    'photos' => PhotoResource::collection($this->photos),
}

Как видите, ресурс ссылается на разные ресурсы и создает для него один объект.
Мой контроллер имеет две функции для обслуживания всех данных и данных с определенным идентификатором.

Это выглядит так:

public function showAll()
{
    return TableResource::collection(TableApi::all());
}

public function show($id)
{
    return new TableResource(TableApi::find($id));
}

И, наконец, я сделал несколько маршрутов:

Route::get('/table', 'TableController@showAll');
Route::get('/table/{id}', 'TableController@show');

Все работает до этого момента.
Теперь следующий сценарий: я хочу, чтобы данные из таблицы фильтровались не только по id, но и по имени одной из таблиц, на которые ссылаются. Итак, в основном мне нужны все записи, где категория->название «Тест».
Возможно ли это вообще с моим подходом?


person kk_    schedule 10.11.2017    source источник
comment
Если ваша модель TableApi и вы объявили связь с моделью Category, вы можете сделать что-то вроде TableApi::where('id', $id)->whereHas('categories', function($query) {$query->where('category.name', 'Test')})->first().   -  person Camilo    schedule 10.11.2017
comment
Это действительно сработало. Спасибо. Но чего не хватает, так это всех полей из ссылочных таблиц (категории и фотографии в моем примере). Есть ли способ расширить ваш запрос, чтобы получить все поля? Может быть, также просто все поля, которые имеют отношение к таблице в модели?   -  person kk_    schedule 10.11.2017
comment
О, надо было поискать. Решением моего комментария было просто добавить его так -›with('photos')   -  person kk_    schedule 10.11.2017
comment
Да, вы можете включить связанные модели, используя with(). Я добавил правильный ответ.   -  person Camilo    schedule 10.11.2017
comment
Пожалуйста, рассмотрите возможность принятия моего ответа, если он решил вашу проблему.   -  person Camilo    schedule 10.11.2017


Ответы (1)


Если ваша модель TableApi и вы объявили связь с моделью Category, вы можете сделать что-то вроде:

TableApi::where('id', $id)->whereHas('categories', function($query) {
    $query->where('category.name', 'Test')
})->first();

Вы можете включить связанные модели Category и Photo, используя with().

TableApi::where('id', $id)->whereHas('categories', function($query) {
    $query->where('category.name', 'Test')
})->with(['categories', 'photos'])->first();

Подробнее о запросах отношений можно прочитать в документации Laravel .

person Camilo    schedule 10.11.2017