@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>
但是此代码为我产生了以下这样的代码 在这里,选举和候选人具有一对多的关系,候选人和用户具有一对一的关系帮助我实现预期的结果。
答案 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)
此代码未经测试,但从理论上讲应该可以工作。我尝试从发布的代码中收集有关模型关系的信息,但是可能需要对模型名称和关系进行一些调整。
以下代码基本上会获取分别具有其area
,candidate
和candidate.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中提供了有关我使用的收集功能的所有文档。