Учитывая следующие две таблицы и отношения:
Контейнеры моделей: id, name, desc, creation_at, updated_at
public function items()
{
return $this->hasMany('App\Models\Items', 'container_id', 'id');
}
Элементы модели: идентификатор, идентификатор контейнера, идентификатор типа, имя, созданный, обновленный,
public function containers()
{
return $this->belongsTo('App\Models\Containers', 'id', 'container_id');
}
Как я могу получить все items
, принадлежащие container
, где все, что у меня есть, container:name
без необходимости что-то вроде:
//Route::get('/api/v1/containers/{container}/items', 'ItemsController@index');
public function index($container)
{
//Show all items in a specific container
return Containers::where('name', $container)
->firstOrFail()
->items()
->get()
->toJson();
}
... и просматривать определенный элемент в определенном контейнере, не выполняя что-то еще более неприятное, например:
//Route::get('/api/v1/containers/{container}/items/{item}', 'ItemsController@show');
public function show($container, $item)
{
//Show specific item in a specific container
return Containers::where('name', $container)
->firstOrFail()
->items()
->where('id', $item)
->firstOrFail()
->toJson();
}
В этом случае у меня есть только имя контейнера в качестве URL-адреса, дружественного к URL-адресу, и помогает предотвратить манипулирование URL-адресами.
Есть ли способ - даже если это вторичное отношение ownTo - добиться этого, ссылаясь на имя контейнера, чтобы я мог просто сделать Items::find($containerName)
без изменения поля primaryKey в моделях.