编辑表单中的嵌套循环 Blade Laravel

Nested Loop in Edit Form Blade Laravel

我有一个使用 rowspan table 和嵌套循环的编辑表单。我也有一个像这样工作正常的创建数据表单。我为这个项目使用了 Laravel 8。

Create form

但是当我从数据库中添加值以创建编辑表单时:

Edit form -1 Edit Form -2

我从数据库中获取 sasaran、指标和数据(问题),然后使用嵌套循环对其进行循环。仅供参考,我有 3 个 sasaran 的数据、12 个指标的数据和 47 个需要使用 rowspan 加载的问题数据。但是当我创建编辑表单时,rowspan 不适合 sasaran、indikator 或问题数量,但它循环了 47 次。 rowspan只适用于sasaran的每一个第一个数据,然后不适用于其余的(如Edit Form -1)并且也复制数据。

仅供参考,我没有使用 Ajax 创建和编辑表单。

这是代码:

查看:

@foreach($sasarans as $i => $sasaran)
@foreach($sasaran->indikator as $indikator)
@foreach($data_laporans as $data)
<tr>
    @if($loop->first)
    <td style="text-align:center; vertical-align:middle;"
        rowspan="{{$indikator->pertanyaan->count()}}">
        {{$i+1}} </td>
    <td style="vertical-align:middle;"
        rowspan="{{$indikator->pertanyaan->count()}}">
        {{$sasaran->sasaran}} </td>
    <td style="vertical-align:middle;"
        rowspan="{{$indikator->pertanyaan->count()}}">
        {{ $indikator->indikator}} </td>
    @endif
    <td style="vertical-align:middle;">
        <textarea style="height:130px;"
            class="form-control transparent disable"
            readonly>{{ $data->pertanyaan->pertanyaan}}</textarea>
        <input type="hidden" name="id_pertanyaan[]" class="form-control"
            value="{{$data->id_pertanyaan}}">
    </td>
    <td>
        <input type="text" name="jumlah[]"
            class="form-control @error('jumlah') is-invalid @enderror"
            value="{{$data->jumlah}}">

        <!--Error Message-->
        @error('jumlah')
        <span class="invalid-feedback" role="alert">
            <strong>{{ $message }}</strong>
        </span>
        @enderror
    </td>
    <td>
        <textarea name="keterangan[]"
            class="form-control @error('keterangan') is-invalid @enderror" value="$data->keterangan"></textarea>

        <!--Error Message-->
        @error('keterangan')
        <span class="invalid-feedback" role="alert">
            <strong>{{ $message }}</strong>
        </span>
        @enderror
    </td>
    <td>
        <div class="custom-file"
            style="margin-left:10px; margin-right:10px;">
            <input type="file" name="bukti[]" class="custom-file-input">
            <label class="custom-file-label"></label>
        </div>

        <!--Error Message-->
        @error('bukti')
        <span class="invalid-feedback" role="alert">
            <strong>{{ $message }}</strong>
        </span>
        @enderror

    </td>
</tr>
@endforeach
@endforeach
@endforeach

控制器:

public function edit($id)
{
    $sasarans = Sasaran::all();
    $laporan_indikators = LaporanIndikator::where('id',$id)->first();
    $data_laporans = DataLaporan::where('id_laporan',$id)->get();
    return view('indikator-kinerja.edit',compact('laporan_indikators','data_laporans','sasarans'));
}

萨萨兰模型:

protected $fillable = ['sasaran'];

public function indikator() {
    return $this->hasMany(DataIndikator::class, 'id_sasaran','id');
}

指标模型:

protected $fillable = ['id_sasaran', 'indikator'];

public function sasaran() {
    return $this->belongsTo(Sasaran::class, 'id_sasaran','id');
}

public function pertanyaan() {
    return $this->hasMany(Pertanyaan::class, 'id_indikator','id');
}

Pertanyaan 的模特:

protected $fillable = ['id_indikator', 'pertanyaan'];

public function indikator() {
    return $this->belongsTo(DataIndikator::class, 'id_indikator','id');
}

public function data_laporan() {
    return $this->belongsTo(DataLaporan::class, 'id_laporan','id');
}

数据拉普兰模型:

protected $fillable = ['id_laporan', 'id_pertanyaan','jumlah','keterangan','bukti'];

public function laporan() {
    return $this->belongsTo(LaporanIndikator::class, 'id_laporan','id');
}

public function pertanyaan() {
    return $this->belongsTo(Pertanyaan::class, 'id_pertanyaan','id');
}

拉普兰指示剂的模型:

 public function data_laporan() {
    return $this->hasMany(DataLaporan::class);
}

我真的很抱歉我的英语不好,但我真的很感谢你的帮助。谢谢。

更新:我试图在我看来这样做来修复行跨度,但问题是每个 sasaran 和 indikator 循环 47 次(我的意思是,不适合它的 sasaran 和 indikator 的数量),并且指标的数量不适合 sasaran。您可以查看我为我想要的示例视图附加的创建表单视图。我想我知道问题出在哪里,但我真的不知道如何解决。请帮助我,因为我还是个初学者。谢谢。

新视图代码:

@foreach($sasarans as $i => $sasaran)
 @php ($first = true) @endphp
   @foreach($sasaran->indikator as $indikator)
     @foreach($data_laporans as $data)
       <tr>
       @if($loop->first)
         <td rowspan="{{$data->pertanyaan->count()}}">{{$i+1}} </td>
         <td rowspan="{{$data->pertanyaan->count()}}">{{$sasaran->sasaran}}</td>
         <td rowspan="{{$data->pertanyaan->count()}}">{{$indikator->indikator}} </td>
 @php ($first = false) @endphp
       @endif
       <td style="vertical-align:middle;"><textarea style="height:130px;"
                                                         class="form-control transparent disable" readonly>{{ $data->pertanyaan->pertanyaan}}</textarea>
<input type="hidden" name="id_pertanyaan[]" class="form-control" value="{{$data->pertanyaan->id}}"></td>
      <td><input type="text" name="jumlah[]" class="form-control @error('jumlah') is-invalid @enderror" value="{{$data->jumlah}}">
          <!--Error Message-->
          @error('jumlah')
           <span class="invalid-feedback" role="alert">
             <strong>{{ $message }}</strong>
            </span>
           @enderror
     </td>
     <td><textarea name="keterangan[]" class="form-control @error('keterangan') is-invalid @enderror">{{$data->keterangan</textarea> 
          <!--Error Message-->
          @error('keterangan')
            <span class="invalid-feedback" role="alert">
              <strong>{{ $message }}</strong>
             </span>
            @enderror
    </td>
    <td>
      <div class="custom-file" style="margin-left:10px; margin-right:10px;">
        <input type="file" name="bukti[]" class="custom-file-input"> 
        <label class="custom-file-label"></label>
       </div>
     <!--Error Message-->
     @error('bukti')
      <span class="invalid-feedback" role="alert">
       <strong>{{ $message }}</strong>
      </span>
     @enderror
   </td>
  </tr>
 @endforeach
@endforeach
@endforeach

New View -1 New View - 2

更新: 您需要做的只是在 data 循环中循环特定数量的索引。

@php $last_count = 0; @endphp
@foreach($sasarans as $i => $sasaran)
    @foreach($sasaran->indikator as $indikator)
        @foreach(array_slice($data_laporans->toArray(), $last_count, $data_count) as $data)
            @php
                $data_count = $data->pertanyaan->count();
            @endphp
            <tr>
                @if($loop->parent->parent->first)
                    <td rowspan="{{$data_count}}">{{$i+1}} </td>
                    <td rowspan="{{$data_count}}">{{$sasaran->sasaran}}</td>
                    <td rowspan="{{$data_count}}">{{$indikator->indikator}} </td>
                @endif                
                <td style="vertical-align:middle;">
                    <textarea style="height:130px;" class="form-control transparent disable" readonly>{{ $data->pertanyaan->pertanyaan}}</textarea>
                    <input type="hidden" name="id_pertanyaan[]" class="form-control" value="{{$data->pertanyaan->id}}">
                </td>
                <td>
                    <input type="text" name="jumlah[]" class="form-control @error('jumlah') is-invalid @enderror" value="{{$data->jumlah}}">
                    <!--Error Message-->
                    @error('jumlah')
                        <span class="invalid-feedback" role="alert">
                            <strong>{{ $message }}</strong>
                        </span>
                    @enderror
                 </td>
                 <td>
                     <textarea name="keterangan[]" class="form-control @error('keterangan') is-invalid @enderror">{{$data->keterangan</textarea> 
                     <!--Error Message-->
                     @error('keterangan')
                         <span class="invalid-feedback" role="alert">
                             <strong>{{ $message }}</strong>
                          </span>
                     @enderror
                  </td>
                  <td>
                      <div class="custom-file" style="margin-left:10px; margin-right:10px;">
                          <input type="file" name="bukti[]" class="custom-file-input"> 
                          <label class="custom-file-label"></label>
                      </div>
                      <!--Error Message-->
                      @error('bukti')
                          <span class="invalid-feedback" role="alert">
                              <strong>{{ $message }}</strong>
                           </span>
                      @enderror
                  </td>
              </tr>
         @endforeach
         @php $last_count += $data_count; @endphp
    @endforeach
@endforeach

试一试,看看是否有效。不幸的是我不能自己调试它。

旧答案: $loop->first 只在第一次工作,因此你的 sasaran 在第一次之后中断。

将开头替换为:

@php
    $tracker = -1;
@endphp
@foreach($sasarans as $i => $sasaran)
    @foreach($sasaran->indikator as $indikator)
        @foreach($data_laporans as $data)
            <tr>
                @php
                    if($tracker !== $i)
                    {
                        $tracker = $i;
                        $new_row = true;
                    } else {
                        $new_row = false;
                    }
                @endphp
                @if($new_row)
                    <td style="text-align:center; vertical-align:middle;" rowspan="{{$indikator->pertanyaan->count()}}">{{$i+1}} </td>
                    <td style="vertical-align:middle;" rowspan="{{$indikator->pertanyaan->count()}}">{{$sasaran->sasaran}} </td>
                    <td style="vertical-align:middle;" rowspan="{{$indikator->pertanyaan->count()}}">{{ $indikator->indikator}} </td>
                @endif

                // Your remaining code

试试这个,看看它是否解决了 sasaran 只在第一次工作的问题?

经过多次尝试,终于找到了解决办法。我只是像这样添加变量 $data_laporans:

@foreach($sasarans as $i => $sasaran)
   @php ($first = true) @endphp
   @foreach($sasaran->indikator as $indikator)
     @foreach($indikator->pertanyaan as $pertanyaan)
        <tr>
           @if($loop->first)
              <td rowspan="{{$indikator->pertanyaan->count()}}">{{$i+1}} </td>
              <td rowspan="{{$indikator->pertanyaan->count()}}">{{$sasaran->sasaran}}</td>
               <td rowspan="{{$indikator->pertanyaan->count()}}">{{$indikator->indikator}}</td>
             @php ($first = false) @endphp
             @endif
                <td><textarea>{{ $pertanyaan->pertanyaan}}</textarea></td>
                @foreach($pertanyaan->data_laporan as $data)
                <!--Add your data here-->
                @endforeach
  </tr>
  @endforeach
 @endforeach
@endforeach

我也改变了 DataLaporan 和 Pertanyaan 之间的关系:

DataLaporan 模型:

public function pertanyaan() {
    return $this->belongsTo(Pertanyaan::class, 'id_pertanyaan','id');
}

国家模型:

public function data_laporan() {
    return $this->hasMany(DataLaporan::class, 'id_pertanyaan','id');
}