I have a controller with 8 methods. Seven of them use this statement:
$item = Item::findOrFail($id);
However, only one needs a different query:
$item = Item::with('subitem')->findOrFail($id);
I would like to define a route model binding for the first seven of these methods, however, is there a way to somehow tell the Laravel that for the last method I want the ID injected instead of an instance of the Item class? Currently I'm doing the following but its quite bad:
$item = Item::with('subitem')->findOrFail($item->id);
Yes, you can do it easily only by changing the parameter name in your route that is being used for model binding, for example, why not use $item
(or something like that) in the routes for which you need model binding so you can bind the model to routes which contains $item
parameter, for example:
Route::post('items/{item}', 'ItemController@update');
When binding the model to route, use something like this:
public function boot(Router $router)
{
parent::boot($router);
$router->model('item', 'App\Item');
}
So, onle when item
parameter is found as route parameter, the Item
model would be bound but for the route which needs an ID
, use route declaration like this one (Using id
as parameter):
Route::post('items/{id}', 'ItemController@whatever');
In ItemController@whatever
method you'll get the id from route:
public function whatever($id)
{
// $id would be an integer value for $id not a model
}