You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 21:35:59