Laravel中Lain-lain输入框数据无法存储显示问题排查
解决方案:新增字段实现自定义付款方式的存储与显示
核心结论
必须在kwitansi数据表中新增lainlaininput字段——你在视图中通过$kwitansi->lainlaininput读取数据,这个属性直接对应数据库字段,没有该字段的话Laravel无法映射数据,自然读不到值。以下是完整实现步骤:
1. 生成并执行数据库迁移
创建迁移文件新增字段:
php artisan make:migration add_lainlaininput_to_kwitansis_table --table=kwitansis
打开生成的迁移文件,修改up和down方法:
public function up() { Schema::table('kwitansis', function (Blueprint $table) { // 用text类型存储较长描述,允许为空 $table->text('lainlaininput')->nullable(); }); } public function down() { Schema::table('kwitansis', function (Blueprint $table) { $table->dropColumn('lainlaininput'); }); }
执行迁移:
php artisan migrate
2. 更新模型的批量赋值白名单
在Kwitansi模型中,将lainlaininput添加到$fillable数组,确保Laravel允许该字段的批量赋值:
class Kwitansi extends Model { protected $fillable = [ // 保留原有字段,新增下面一行 'lainlaininput', 'pembayaran', // 其他字段... ]; }
3. 调整前端表单
确保自定义输入框的name属性为lainlaininput,同时添加编辑时的回显逻辑:
<!-- 付款方式复选框组 --> <div class="form-group"> <label>Metode Pembayaran</label> <div class="form-check"> <input class="form-check-input" type="checkbox" name="pembayaran[]" value="Transfer Bank" {{ in_array('Transfer Bank', old('pembayaran', explode(',', $kwitansi->pembayaran ?? ''))) ? 'checked' : '' }}> <label class="form-check-label">Transfer Bank</label> </div> <div class="form-check"> <input class="form-check-input" type="checkbox" name="pembayaran[]" value="Lain-lain" {{ in_array('Lain-lain', old('pembayaran', explode(',', $kwitansi->pembayaran ?? ''))) ? 'checked' : '' }}> <label class="form-check-label">Lain-lain</label> </div> <!-- 自定义输入框,默认隐藏 --> <div id="lainlaininput-container" class="mt-2" style="display: none;"> <input type="text" name="lainlaininput" id="lainlaininput" class="form-control" value="{{ old('lainlaininput', $kwitansi->lainlaininput ?? '') }}" placeholder="Masukkan detail metode pembayaran"> </div> </div> <script> $(document).ready(function() { // 页面加载时判断是否显示输入框 const selectedPembayaran = {!! json_encode(old('pembayaran', $kwitansi->pembayaran ? explode(',', $kwitansi->pembayaran) : [])) !!}; if (selectedPembayaran.includes('Lain-lain')) { $('#lainlaininput-container').show(); } // 勾选/取消勾选时切换显示 $('input[name="pembayaran[]"]').change(function() { const isLainLainChecked = $('input[name="pembayaran[]"][value="Lain-lain"]').is(':checked'); $('#lainlaininput-container').toggle(isLainLainChecked); if (!isLainLainChecked) { $('#lainlaininput').val(''); // 取消勾选时清空输入 } }); }); </script>
4. 修改控制器的存储与更新逻辑
在KwitansiController的store和update方法中,处理pembayaran数组转字符串,并存储lainlaininput:
// 存储方法 public function store(Request $request) { $request->validate([ 'pembayaran' => 'required|array', 'lainlaininput' => 'nullable|string', // 其他验证规则... ]); // 将复选框数组转为逗号分隔的字符串 $pembayaran = implode(',', $request->pembayaran); Kwitansi::create([ 'pembayaran' => $pembayaran, 'lainlaininput' => $request->lainlaininput, // 其他字段赋值... ]); return redirect()->route('kwitansis.index')->with('success', 'Kwitansi berhasil ditambahkan'); } // 更新方法 public function update(Request $request, Kwitansi $kwitansi) { $request->validate([ 'pembayaran' => 'required|array', 'lainlaininput' => 'nullable|string', // 其他验证规则... ]); $pembayaran = implode(',', $request->pembayaran); $kwitansi->update([ 'pembayaran' => $pembayaran, 'lainlaininput' => $request->lainlaininput, // 其他字段赋值... ]); return redirect()->route('kwitansis.index')->with('success', 'Kwitansi berhasil diupdate'); }
5. 在列表页和详情页显示数据
列表页:
<table class="table"> <thead> <tr> <th>Metode Pembayaran</th> <th>Detail Lain-lain</th> <!-- 其他表头 --> </tr> </thead> <tbody> @foreach($kwitansis as $kwitansi) <tr> <td>{{ $kwitansi->pembayaran }}</td> <td> @if(str_contains($kwitansi->pembayaran, 'Lain-lain')) {{ $kwitansi->lainlaininput ?? '-' }} @else - @endif </td> <!-- 其他列 --> </tr> @endforeach </tbody> </table>
详情页:
<div class="card"> <div class="card-body"> <h5 class="card-title">Detail Kwitansi</h5> <p class="card-text"><strong>Metode Pembayaran:</strong> {{ $kwitansi->pembayaran }}</p> @if(str_contains($kwitansi->pembayaran, 'Lain-lain')) <p class="card-text"><strong>Detail:</strong> {{ $kwitansi->lainlaininput }}</p> @endif <!-- 其他详情内容 --> </div> </div>
内容的提问来源于stack exchange,提问作者Fathurrochman Jati Kusuma
相关产品推荐
相关产品推荐

