adamiscoding
adamiscoding

Reputation: 128

Nested resource routes

How do I trigger index method from nested resources? For example I have route:

Route::resource('diagrams.steps', 'DiagramStepsController');  

I allows URLs like /diagrams/1/steps/3 which triggers show($diagramId, $stepID). I would like to get all steps that belong to the diagram with ID 1: /diagrams/1/steps.

How do I achieve achieve that?

Upvotes: 0

Views: 87

Answers (2)

adamiscoding
adamiscoding

Reputation: 128

Route::resource('diagrams.steps', 'DiagramStepsController');  

Gives me GET|HEAD diagrams/{diagrams}/steps route. It calls index method with argument matching diagrams id: {diagrams}. So in order to get all steps that belongs to navigated diagram i had to write method as follows:

public function index($id) 
{
    $steps = Step::where('diagram_id', '=', $id)->get();

    return Response::json(
            array(
                'error' => false,
                'steps' => $steps
            ), 
            200
    );
}   

Upvotes: 0

Bogdan
Bogdan

Reputation: 44526

The route definition you posted:

Route::resource('diagrams.steps', 'DiagramStepsController');

Should generate the following routes:

+--------+-------------------------------------------------+------------------------+--------------------------------+----------------+---------------+
| Domain | URI                                             | Name                   | Action                         | Before Filters | After Filters |
+--------+-------------------------------------------------+------------------------+--------------------------------+----------------+---------------+
|        | GET|HEAD diagrams/{diagrams}/steps              | diagrams.steps.index   | DiagramStepsController@index   |                |               |
|        | GET|HEAD diagrams/{diagrams}/steps/create       | diagrams.steps.create  | DiagramStepsController@create  |                |               |
|        | POST diagrams/{diagrams}/steps                  | diagrams.steps.store   | DiagramStepsController@store   |                |               |
|        | GET|HEAD diagrams/{diagrams}/steps/{steps}      | diagrams.steps.show    | DiagramStepsController@show    |                |               |
|        | GET|HEAD diagrams/{diagrams}/steps/{steps}/edit | diagrams.steps.edit    | DiagramStepsController@edit    |                |               |
|        | PUT diagrams/{diagrams}/steps/{steps}           | diagrams.steps.update  | DiagramStepsController@update  |                |               |
|        | PATCH diagrams/{diagrams}/steps/{steps}         |                        | DiagramStepsController@update  |                |               |
|        | DELETE diagrams/{diagrams}/steps/{steps}        | diagrams.steps.destroy | DiagramStepsController@destroy |                |               |
+--------+-------------------------------------------------+------------------------+--------------------------------+----------------+---------------+

Notice the very first route is diagrams/{diagrams}/steps which calls the index method of your controller, which is what you are asking for.

Upvotes: 2

Related Questions