Home > Blockchain >  Passing variable from index to controller using Laravel
Passing variable from index to controller using Laravel

Time:01-06

I am new to using Laravel and I am currently trying to pass a variable from the index blade file to the controller in order to bring up all apparatus type fields associated with a specific apparatus code id.

I am able to access the apparatus type fields associated with the apparatus code id when I include a specific number which correlates to that apparatus code id (eg. inputting 2 brings up the apparatus type details for the apparatus code id 2, inputting 3 brings up the apparatus type details for the apparatus code id 3 etc).

However when I have tried to pass a variable relating to each individual apparatus code id using a for loop in the controller, the apparatus type loop appears to not be accessed and does not return any information. I will include snippets of my current code for clarity.

Any help or guidance with this issue would be greatly appreciated!

Controller file

public function index()
    {
        $apparatusCodes = ApparatusCodes::get();
       foreach ($apparatusCodes as $apparatusCode){
     $apparatusTypes = ApparatusTypes::where('apparatus_code_id', $apparatusCode->id)->get();
 }
        return view('apparatus_codes.index', compact('apparatusCodes', 'apparatusTypes'));
    }

Index.blade file

<table id="datatable"  style="width:100%; padding-top: 1em;  padding-bottom: 1em;">
      <thead>
        <tr>
          <th>ID</th>
          <th >Apparatus Code</th>
          <th>Description</th>
          <th>Rent</th>
          <th></th>
        </tr> 
      </thead>
<!--start of for loop-->
@foreach ($apparatusCodes as $apparatusCode)
    
      <tbody>
         <tr data-toggle="collapse" id="table{{ $apparatusCode->id}}" data-target=".table{{ $apparatusCode->id}}"> 
          <td> {{ $apparatusCode->id}} </td>
          <td>{{ $apparatusCode->apparatus_code}} </td>  
          <td> {{ $apparatusCode->description}}</td>
          <td> {{ $apparatusCode->rent}}</td>
          <td @click="isOpen = !isOpen" ><img  :
                    src="../img/Icon-arrow-dropdown-white.png" alt="arrow down">
          </td>
          <td><img  :
                    src="../img/edit-icon.svg" alt="Edit Icon">
          </td>
        </tr> 
        <tr x-show.transition.duration.300ms.origin.bottom="isOpen" x-cloak @click.away="isOpen = false" >
          <td colspan="999">
            <div>
              <table id="datatable" >
                <thead>
                  <tr>
                  <th>Apparatus Code </th>
                  <th>Apparatus Type</th>
                  <th>Compensation </th>
                  <th>Created On </th>
                  <th>Created By </th>
                  <th></th>
            
               
    @foreach ($apparatusTypes as $apparatusType)
                </thead>
                <tbody>
                
    <tr>
     
            <td>{{ $apparatusCode->apparatus_code}}</td>
            <td>{{ $apparatusType->apparatus_type }}</td>
            <td>{{ $apparatusType->compensation }}</td>
            <td>{{ $apparatusType->created_at }}</td>
            <td>{{ $apparatusType->users->name}}</td>
            <td> <button type="button" ><img  src="/../../img/Icon-edit-gray.png" alt="edit"></button></td>

                                       
        </tr>
        @endforeach  
      </table>
    </tr> 
</tr>
</td>
      </tbody>
    
    @endforeach
  </table>

CodePudding user response:

If you have the relationships setup you could eager load the ApparatusTypes for each ApparatusCode:

$apparatusCodes = ApparatusCodes::with('appartusTypes')->get();

Then in the view you could iterate the appartusTypes of each ApparatusCode:

@foreach ($apparatusCodes as $apparatusCode)
    ...
    @foreach ($apparatusCode->apparatusTypes as $type)
        ...
    @endforeach
    ...
@endforeach

Without using the relationships you could get all the ApparatusTypes for the ApparatusCodes and then group them by apparatus_code_id:

$codes = ApparatusCodes::get();
$types = ApparatusTypes::whereIn('apparatus_code_id', $codes->pluck('id'))
    ->get()
    ->groupBy('apparatus_code_id');

Then in the view you could iterate the group that corresponds to the current Code's apparatus_code_id:

@foreach ($codes as $code)
    ...
    @foreach ($types->get($code->id, []) as $type)
        ...
    @endforeach
    ...
@endforeach

Laravel 8.x Docs - Eloquent - Relationships - Eeager Loading with

Laravel 8.x Docs - Collections - Available Methods - pluck

Laravel 8.x Docs - Collections - Available Methods - groupBy

  •  Tags:  
  • Related