使用 Laravel 将变量从索引传递到控制器

Passing variable from index to controller using Laravel

提问人:Conlaodh Quinn 提问时间:1/5/2022 最后编辑:brombeerConlaodh Quinn 更新时间:1/6/2022 访问量:365

问:

我是使用 Laravel 的新手,我目前正在尝试将索引刀片文件中的变量传递给控制器,以便调出与特定设备代码 ID 关联的所有设备类型字段。

当我包含与该设备代码 ID 相关的特定数字时,我能够访问与该设备代码 ID 关联的设备类型字段(例如,输入 2 会显示设备代码 ID 2 的设备类型详细信息,输入 3 会显示设备代码 ID 3 的设备类型详细信息等)。

但是,当我尝试在控制器中使用 for 循环传递与每个单独的设备代码 ID 相关的变量时,设备类型循环似乎未被访问并且不返回任何信息。为了清楚起见,我将包含我当前代码的片段。

对此问题的任何帮助或指导将不胜感激!

控制器文件

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 文件

<table id="datatable" class="stripe hover dt-responsive display nowrap" 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" class="main-bg"><img class="mb-1 duration-300  h-6 w-6" :class="{'transform rotate-180' : isOpen}"
                    src="../img/Icon-arrow-dropdown-white.png" alt="arrow down">
          </td>
          <td><img class="mb-1 duration-300  h-6 w-6" :class="{'transform rotate-180' : isOpen}"
                    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" class="collapse table{{ $apparatusCode->id}}">
          <td colspan="999">
            <div>
              <table id="datatable" class="table table-striped">
                <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" class="btn btn-default btn-edit js-edit"><img class="mb-1 duration-300 ml-4 inset-0 h-6 w-6" src="/../../img/Icon-edit-gray.png" alt="edit"></button></td>

                                       
        </tr>
        @endforeach  
      </table>
    </tr> 
</tr>
</td>
      </tbody>
    
    @endforeach
  </table>
PHP 拉维尔

评论

1赞 lagbox 1/5/2022
欢迎来到 SO ...你正在覆盖循环的每次迭代......您是否正在尝试获取每个 ApparatusCode 的 ApparatusType?(关系在这里会有所帮助)......在您看来,ApparatusType 和 ApparatusCode 之间没有直接关系$apparatusTypesforeach
0赞 Conlaodh Quinn 1/5/2022
谢谢,是的,每个 ApparatusCode 都有一个 ApparatusType - 我试图在模型中建立 ApparatusType 和 ApparatusCode 之间的关系,例如。在 ApparatusType 模型中,我包含了公共函数 apparatusCodes() { return $this->belongsTo(ApparatusCodes::class, 'id' ); } 在 ApparatusCode 模型中,我包含了公共函数 apparatusTypes() { return $this->hasMany(ApparatusTypes::class, 'apparatus_code_id');

答:

0赞 lagbox 1/5/2022 #1

如果您设置了关系,则可以立即加载每个:ApparatusTypesApparatusCode

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

然后,在视图中,您可以迭代每个:appartusTypesApparatusCode

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

在不使用关系的情况下,您可以获取 ApparatusCode 的所有 ApparatusType,然后按以下条件对它们进行分组:apparatus_code_id

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

然后,在视图中,您可以迭代与当前代码对应的组:apparatus_code_id

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

Laravel 8.x Docs - 雄辩 - 关系 - Eeager Loading with

Laravel 8.x Docs - 集合 - 可用方法 - pluck

Laravel 8.x Docs - 集合 - 可用方法 - groupBy

评论

1赞 Conlaodh Quinn 1/6/2022
我已经实施了您的第一个涉及急切加载的解决方案,这似乎奏效了,感谢您的所有帮助!我将阅读有关急切加载的文档以充分了解它的发展,再次感谢!
0赞 lagbox 1/6/2022
没问题,我会为答案中使用的内容添加一些文档链接......如果答案是你要找的,请随时接受这个答案