我有一个通用的方法问题,虽然我的代码在Laravel Blade中。 我有子数据的数据。每个父记录由行表示,但每个子数据将显示在同一行中,仅显示在相邻列中。有一定数量的列。每个家长都会有不同的子记录。但是子数据需要显示在特定列中。
我不能这样做:
foreach($children as $data)
if(data belongs)
show content
else
show blank form
endif
endforeach
否则我的td比所需的少。
我想出的最好的是:
<tr>
<td> Location </td>
<td>
$colA = false
@foreach($children as $data)
@if(child belongs in column A)
{{$child->content}}
@colA = true
@endif()
@end foreach
@if($colA == false)
display blank form input
@endif()
</td>
<td>
$colB = false
@foreach($children as $data)
@if(child belongs in column B)
{{$child->content}}
@colB = true
@endif()
@end foreach
@if($colB == false)
display blank form input
@endif()
</td>
//-------repeat for 6 more times
</tr>
但这似乎效率低下。特别是因为我将同时显示多达一百个父记录,每个记录都有8个&#34; children-columns&#34;。因此,foreach循环将运行800次....
任何有助于提高效率的帮助都将非常感激。
谢谢
答案 0 :(得分:0)
您可以一次性预处理数据,以便您的模板更容易使用。
所以在你的路线/控制器/模板之前的任何东西(或者在模板内):
$preProcessed = [];
for ($parents as $parent) {
$orderedChildren = [];
for ($parent->children as $child) {
$childColumnIndex = ... <-- determine which column this child should be in
$orderedChildren[$childColumnIndex] = $child;
}
$preProcessed[] = [$parent, $orderedChildren];
}
然后在你的模板中,循环遍历[parent,orderedChildren]对:
<tr>
<td> Location </td>
<td>
@if(isset($orderedChildren[0]))
$orderedChildren[0]->content();
@else
display blank form input
@endif
</td>
[other columns]
</tr>
实际上,此时,您还可以循环列索引,而不是为每个索引复制html。
如果您可以在执行数据库查询时订购子数组,那么实际上有更好的方法可用。如果可以执行此操作,则可以删除预订步骤,但模板呈现代码会更复杂。在伪代码中:
for each parent:
$nextChildIndex = 0
for each column:
if ($nextChildIndex < length($parent->children) &&
$parent->children[$nextChildIndex] belongs to this column)
$parent->children[$nextChildIndex]->content();
$nextChildIndex++;
else
display blank form input