如何在Laravel中解决表中的动态行跨问题

时间:2019-12-03 18:32:54

标签: php laravel

我正在尝试显示下图所示的表格 enter image description here 我在下面写了这个表创建的逻辑

 @foreach($users as $key => $user)
            <tr>
              <td>{{$key+1}}</td>
              <td>{{$user->name}}</td>
              <td rowspan="{{count($users->where('area',$user->area))}}">
                 {{$user->userarea->name}}</td>

              <td rowspan="{{count($user->candidate->election->candidates)}}">{{$user->candidate->election->name}}</td>
            </tr>
            @endforeach
             </tbody>

但是此代码为我产生了以下这样的代码 enter image description here 在这里,选举和候选人具有一对多的关系,候选人和用户具有一对一的关系帮助我实现预期的结果。

2 个答案:

答案 0 :(得分:0)

您可以跟踪已经进行了哪些选举/区域。这可以通过创建一个包含对这些对象的引用的数组来完成。然后在模板中添加一条if语句,检查是否已经渲染了选举/区域:

<?php $renderedElections = []; ?>
<?php $renderedAreas = []; ?>
@foreach($users as $key => $user)
<tr>
    <td>{{$key+1}}</td>
    <td>{{$user->name}}</td>
    @if (!in_array($user->userarea->name, $renderedAreas))
        <?php $renderedElections[] = $user->userarea->name ?>
        <td rowspan="{{count($user->userarea->name)}}">
            {{$user->userarea->name}}
        </td>
    @endif
    @if (!in_array($user->candidate->election->name, $renderedElections))
        <?php $renderedElections[] = $user->candidate->election->name ?>
        <td rowspan="{{count($user->candidate->election->candidates)}}">
            {{$user->candidate->election->name}}
        </td>
    @endif
</tr>

这不是最好的解决方案,但是它很简单。为此,必须按选举和地区对用户进行完美分类。

答案 1 :(得分:0)

此代码未经测试,但从理论上讲应该可以工作。我尝试从发布的代码中收集有关模型关系的信息,但是可能需要对模型名称和关系进行一些调整。

以下代码基本上会获取分别具有其areacandidatecandidate.election关系的所有用户,然后按“选举名称”(第一个条件)对用户进行分组,然后按“区域名称”进行分组'(第二个条件)。

结果数组将如下所示:

// $elections will be:
// [
//      'Presidential' => [
//          'Dhaka-5' => [ candidates for that area in that election type ],
//          'Dhaka-1' => [ candidates for that area in that election type ],
//          ...
//      ],
//      ...
// ]

在您的控制器中执行

$elections = User::with('area', 'candidate.election')->get()->groupBy(function ($user) {
    return $user->candidate->election->name;
}, function ($user) {
    return $user->area->name;
});

// then pass $elections to the view...

然后在您的视图中:

<table>
@php ($i = 1)
@foreach ($elections as $election => $areas)
    @foreach ($areas as $area => $candidates)
        @php ($areaLoop = $loop)

        @foreach ($candidates as $user)
            <tr>
                <td>{{ $i++ }}</td>
                <td>{{ $user->name }}</td>
                @if ($loop->first)
                    <td rowspan="{{ $candidates->count() }}">{{ $area }}</td>
                @endif

                @if ($areaLoop->first)
                    <td rowspan="{{ $areas->sum(function ($area) { return $area->count(); }); }}">{{ $election }}</td>
                @endif
            </tr>
        @endforeach
    @endforeach
@endforeach
</table>

请注意,$candidates->count()将是当前选举类型的特定选举区域的候选人数。 $areas->sum(...)将对每个区域的候选人总数求和,以获得该选举类型的候选人总数。

如果您需要进一步的说明或无法解决问题,请告诉我。 here中提供了有关我使用的收集功能的所有文档。