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

Laravel项目中JS动态生成带不同属性的表单DIV及控制器实现咨询

实现方案

一、前端动态表单实现

核心思路是用计数器标记每个生成的区块,输入框采用数组格式命名,后端可直接解析为数组批量处理。

1. HTML结构调整

<!-- 表单包裹,提交地址换成你自己的路由 -->
<form action="{{ route('pricing.store') }}" method="POST">
  @csrf
  <!-- 新增按钮 -->
  <button type="button" class="btn btn-primary mb-3" id="addPricingBtn">新增定价条目</button>
  <!-- 定价区块容器 -->
  <div id="pricingContainer">
    <!-- 初始的第一个定价区块 -->
    <div class="container-fluid" style="display:block" id="div_0">
      <div class="fade-in">
        <div class="card">
          <div class="card-header"> pricing </div>
          <div class="card-body">                      
            <div class="body">
              <div class="form-group">
                <label for="carnumber_0">car number</label>
                <input type="text" class="form-control" name="pricings[0][carnumber]" id="carnumber_0" placeholder="car number">
              </div>   
              <div class="form-group">
                <label for="price_0">price</label>
                <input type="text" class="form-control" name="pricings[0][price]" id="price_0" placeholder="price">
              </div>  
              <div class="form-group">
                <label for="minday_0">min day</label>
                <input type="text" class="form-control" name="pricings[0][minday]" id="minday_0" placeholder="min day">
              </div>  
              <div class="form-group">
                <label for="saleprice_0">sale price</label>
                <input type="text" class="form-control" name="pricings[0][saleprice]" id="saleprice_0" placeholder="sale price">
              </div>  
              <div class="form-group">
                <label for="mindaystay_0">min day stay</label>
                <input type="text" class="form-control" name="pricings[0][mindaystay]" id="mindaystay_0" placeholder="min day stay">
              </div>
              <!-- 可选:新增删除按钮 -->
              <button type="button" class="btn btn-danger delete-btn mt-2">删除当前条目</button>
            </div>
          </div>
        </div>
      </div>
    </div>
  </div>
  <button type="submit" class="btn btn-success mt-3">提交所有数据</button>
</form>

<!-- 定价区块模板,用来复制生成新的区块 -->
<template id="pricingTemplate">
  <div class="container-fluid" style="display:block" id="div__INDEX__">
    <div class="fade-in">
      <div class="card">
        <div class="card-header"> pricing </div>
        <div class="card-body">                      
          <div class="body">
            <div class="form-group">
              <label for="carnumber__INDEX__">car number</label>
              <input type="text" class="form-control" name="pricings[__INDEX__][carnumber]" id="carnumber__INDEX__" placeholder="car number">
            </div>   
            <div class="form-group">
              <label for="price__INDEX__">price</label>
              <input type="text" class="form-control" name="pricings[__INDEX__][price]" id="price__INDEX__" placeholder="price">
            </div>  
            <div class="form-group">
              <label for="minday__INDEX__">min day</label>
              <input type="text" class="form-control" name="pricings[__INDEX__][minday]" id="minday__INDEX__" placeholder="min day">
            </div>  
            <div class="form-group">
              <label for="saleprice__INDEX__">sale price</label>
              <input type="text" class="form-control" name="pricings[__INDEX__][saleprice]" id="saleprice__INDEX__" placeholder="sale price">
            </div>  
            <div class="form-group">
              <label for="mindaystay__INDEX__">min day stay</label>
              <input type="text" class="form-control" name="pricings[__INDEX__][mindaystay]" id="mindaystay__INDEX__" placeholder="min day stay">
            </div>
            <button type="button" class="btn btn-danger delete-btn mt-2">删除当前条目</button>
          </div>
        </div>
      </div>
    </div>
  </div>
</template>

2. JS逻辑代码

// 初始化计数器,初始已经有1个区块,所以从1开始
let pricingIndex = 1;
const addBtn = document.getElementById('addPricingBtn');
const container = document.getElementById('pricingContainer');
const template = document.getElementById('pricingTemplate');

// 监听新增按钮点击
addBtn.addEventListener('click', () => {
  // 复制模板内容
  const clone = template.content.cloneNode(true);
  // 替换模板里所有的__INDEX__为当前计数器值
  const html = clone.firstElementChild.outerHTML.replaceAll('__INDEX__', pricingIndex);
  // 追加到容器
  container.insertAdjacentHTML('beforeend', html);
  // 计数器自增
  pricingIndex++;
});

// 监听删除按钮点击(事件委托,处理动态生成的删除按钮)
container.addEventListener('click', (e) => {
  if (e.target.classList.contains('delete-btn')) {
    e.target.closest('.container-fluid').remove();
  }
});

二、Laravel后端处理

1. 路由配置(routes/web.php)

use App\Http\Controllers\PricingController;

Route::post('/pricing/store', [PricingController::class, 'store'])->name('pricing.store');

2. 控制器代码(app/Http/Controllers/PricingController.php)

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Models\Pricing; // 对应你的定价表模型

class PricingController extends Controller
{
    public function store(Request $request)
    {
        // 表单验证,支持批量验证所有条目
        $validated = $request->validate([
            'pricings' => 'required|array',
            'pricings.*.carnumber' => 'required|string|max:255',
            'pricings.*.price' => 'required|numeric|min:0',
            'pricings.*.minday' => 'required|integer|min:1',
            'pricings.*.saleprice' => 'nullable|numeric|min:0',
            'pricings.*.mindaystay' => 'required|integer|min:1',
        ]);

        // 批量插入数据
        foreach ($validated['pricings'] as $pricingItem) {
            Pricing::create($pricingItem);
        }

        // 提交成功后的跳转,可根据需求修改
        return back()->with('success', '所有定价数据提交成功');
    }
}

3. 模型配置(app/Models/Pricing.php)

确保模型的可写字段包含你要存入的字段:

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class Pricing extends Model
{
    protected $fillable = [
        'carnumber',
        'price',
        'minday',
        'saleprice',
        'mindaystay',
    ];
}

内容的提问来源于stack exchange,提问作者Mhamad Abu AlGhanam

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 08:06:04