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

Laravel 5.3中如何为Bootstrap模态框传递foreach循环数组数据

如何在Laravel Blade中将每行的详情数组传递给Bootstrap模态框

嘿,我来帮你搞定这个问题!你现在需要实现的是点击表格每行的详情按钮,在Bootstrap模态框里展示对应业务的专属详情数据对吧?下面给你两种实用的方案,你可以根据自己的场景选择:

方案1:单模态框+JavaScript动态填充(推荐,适合大量数据)

这个方案只需要一个模态框,通过Bootstrap的data-*属性传递数据,再用JS动态渲染内容,性能更优。

步骤1:修改表格行的详情按钮

在循环里给按钮添加data-details属性,把当前业务的详情数据转成JSON格式存进去:

<div class="table-responsive">
  <table class="table table-bordered m-table" id="business">
    <thead class="columns">
      <tr>
        <th class="column1">Name</th>
        <th class="column2">Contact</th>
        <th class="column3">Details</th>
      </tr>
    </thead>
    <tbody class="main-rows list">
      @foreach ($listBusiness as $business)
      <tr>
        <td class="column1">{{$business->name}}</td>
        <td class="column2">{{$business->contact}}</td>
        <td class="column7">
          <!-- 添加data-details属性传递详情数据 -->
          <a data-toggle="modal" data-target="#modalBusinessDetails" data-details="{{ json_encode($business->details) }}">
            <i class="la la-search"></i>
          </a>
        </td>
      </tr>
      @endforeach
    </tbody>
  </table>
</div>

步骤2:修改模态框结构,预留动态填充位置

把模态框里的表格tbody改成空的,添加一个ID方便JS定位:

<!-- Modal table -->
<div class="modal" id="modalBusinessDetails" role="dialog">
  <div class="modal-dialog">
    <div class="modal-content">
      <div class="modal-body text-center">
        <div class="col-12">
          <div class="table-responsive">
            <table class="table table-bordered m-table">
              <thead class="columns">
                <tr>
                  <th class="column1">Created at</th>
                  <th class="column2">Active</th>
                  <th class="column3">Employees</th>
                </tr>
              </thead>
              <!-- 添加ID用于JS填充内容 -->
              <tbody class="main-rows" id="modal-details-body">
              </tbody>
            </table>
          </div>
        </div>
        <div class="btn group">
          <button type="button" data-dismiss="modal">{{ trans('Close') }}</button>
        </div>
      </div>
    </div>
  </div>
</div>

步骤3:添加JavaScript监听模态框事件

监听模态框的show.bs.modal事件,获取传递的详情数据并动态生成表格行:

<script>
$('#modalBusinessDetails').on('show.bs.modal', function (event) {
  // 获取触发模态框的按钮
  var triggerBtn = $(event.relatedTarget);
  // 解析按钮上的详情数据(JSON转成JS对象)
  var businessDetails = JSON.parse(triggerBtn.data('details'));
  var modal = $(this);
  var tableBody = modal.find('#modal-details-body');
  
  // 清空之前的内容,避免残留数据
  tableBody.empty();
  
  // 循环生成每行数据
  $.each(businessDetails, function(index, detail) {
    var rowHtml = `
      <tr>
        <td class="column1">${detail.created_at}</td>
        <td class="column2">${detail.active}</td>
        <td class="column3 text-center">${detail.employees}</td>
      </tr>
    `;
    tableBody.append(rowHtml);
  });
});
</script>

方案2:为每行生成独立模态框(适合数据量小的场景)

如果你的业务数据不多,可以直接在循环里为每行生成一个专属的模态框,不需要JS处理,直接用Blade渲染内容。

修改后的完整代码

<div class="table-responsive">
  <table class="table table-bordered m-table" id="business">
    <thead class="columns">
      <tr>
        <th class="column1">Name</th>
        <th class="column2">Contact</th>
        <th class="column3">Details</th>
      </tr>
    </thead>
    <tbody class="main-rows list">
      @foreach ($listBusiness as $business)
      <tr>
        <td class="column1">{{$business->name}}</td>
        <td class="column2">{{$business->contact}}</td>
        <td class="column7">
          <!-- 目标指向当前行专属的模态框ID -->
          <a data-toggle="modal" data-target="#modalBusinessDetails-{{ $business->id }}">
            <i class="la la-search"></i>
          </a>
        </td>
      </tr>

      <!-- 当前业务专属的模态框 -->
      <div class="modal" id="modalBusinessDetails-{{ $business->id }}" role="dialog">
        <div class="modal-dialog">
          <div class="modal-content">
            <div class="modal-body text-center">
              <div class="col-12">
                <div class="table-responsive">
                  <table class="table table-bordered m-table">
                    <thead class="columns">
                      <tr>
                        <th class="column1">Created at</th>
                        <th class="column2">Active</th>
                        <th class="column3">Employees</th>
                      </tr>
                    </thead>
                    <tbody class="main-rows">
                      <!-- 直接渲染当前业务的详情数据 -->
                      @foreach ($business->details as $BusinessDetail)
                      <tr>
                        <td class="column1">{{$BusinessDetail->created_at}}</td>
                        <td class="column2">{{$BusinessDetail->active}}</td>
                        <td class="column3 text-center">{{$BusinessDetail->employees}}</td>
                      </tr>
                      @endforeach
                    </tbody>
                  </table>
                </div>
              </div>
              <div class="btn group">
                <button type="button" data-dismiss="modal">{{ trans('Close') }}</button>
              </div>
            </div>
          </div>
        </div>
      </div>
      @endforeach
    </tbody>
  </table>
</div>

关键准备工作(控制器端)

不管用哪种方案,你都需要在控制器里给每个$business预加载对应的详情数据,避免N+1查询问题:

// 控制器代码示例
public function index()
{
    // 预加载details关联数据
    $listBusiness = \App\Business::with('details')->get();
    return view('your-view-name', compact('listBusiness'));
}

同时确保你的Business模型已经定义了与详情模型的关联:

// app/Business.php
namespace App;

use Illuminate\Database\Eloquent\Model;

class Business extends Model
{
    public function details()
    {
        // 假设你的详情模型是BusinessDetail,关联字段是business_id
        return $this->hasMany(BusinessDetail::class);
    }
}

内容的提问来源于stack exchange,提问作者Ferran Muñoz

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 08:44:35