编辑表单中的嵌套循环 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');
}
我有一个使用 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');
}