有没有"Laravel"方法可以执行以下代码?



我使用了各种循环来将数据存储在数组中,我认为这是一种老式的方式。稍后,这些阵列再次用于显示数据。我使用的环路如下

foreach ($adsources as $adsource) {
$adsou[$x] = $adsource->newspaper;
$count[$x] = '0';
$areac[$x] = '0';
$areab[$x] = '0';
foreach ($advert as $ad) {                
if ($ad->adsource_id == $adsource->id) {
$count[$x]++;
$cctemp = ($ad->c) * ($ad->cm);
if ($ad->color=='0') {
$areac[$x] = $areac[$x] + $cctemp;
} else {
$areab[$x] = $areab[$x] + $cctemp;
}
}
if ($count!='0') {
$totalcc[$x] = $areac[$x] + $areab[$x];
} else {
$totalcc[$x] = '0';
}
}
$x++;
}

视图表如下

<thead class="thead-dark">
<th>Newspaper Name</th>
<th>Count</th>
<th>Area[Color]</th>
<th>Area[B&W]</th>
<th>Total Area(cc)</th>
</thead>
<tbody>                                               
@for ($i = 0; $i < $x; $i++)
<tr>
<td>{{ $adsou[$i] }}</td>
<td>{{ $count[$i] }}</td>
<td>{{ $areac[$i] }}</td>
<td>{{ $areab[$i] }}</td>
<td>{{ $totalcc[$i] }}</td>
</tr>
@endfor
</tbody>

我在控制器中定义了以下变量

$adsources = Adsource::all();
$advert = Advertisement::all();
$x = '0';
$areac = array();
$areab = array();
$totalcc = array(); 
$cctemp = '0'; 
$adsou = array(); 
$count = array(); 

返回的视图如下

return view('pages.report.reportbysource', compact('adsou', 'count', 'areac', 'areab', 'totalcc', 'x'));
} 

广告表包含(id,date,adsource_id,color,c,cm(

adsource_id为外键;该表包含(id,报纸(

控制器中的功能看起来像这个

public function reportBySource()
{        
$adsources = Adsource::all();
$advert = Advertisement::all();
$x = '0';
$areac = array();
$areab = array();
$totalcc = array();
$cctemp = '0';
$adsou = array();
$count = array();

foreach ($adsources as $adsource) {
$adsou[$x] = $adsource->newspaper;
$count[$x] = '0';
$areac[$x] = '0';
$areab[$x] = '0';
foreach ($advert as $ad) {                
if ($ad->adsource_id == $adsource->id) {
$count[$x]++;
$cctemp = ($ad->c) * ($ad->cm);
if ($ad->color == '0') {
$areac[$x] = $areac[$x] + $cctemp;
} else {
$areab[$x] = $areab[$x] + $cctemp;
}
}
if ($count != '0') {
$totalcc[$x] = $areac[$x] + $areab[$x];
} else {
$totalcc[$x] = '0';
}
}
$x++;
}        
return view('pages.report.reportbysource', compact('adsou', 'count', 'areac', 'areab', 'totalcc', 'x'));
}

根据您的问题,我假设AdsourceAdvertisement之间存在关系

# Adsource model
public function advertisements()
{
return $this->hasMany(Advertisement::class, 'adsource_id');
}
# Advertisement model
public function adsource()
{
return $this->belongsTo(Adsource::class, 'adsource_id');
}

接下来,我认为$areab$areac$totalcc看起来像是一些访问器方法

# Advertisement model
// Usage: $advertisement->cc
public function getCcAttribute()
{
return $this->c * $this->cm;
}
# Adsource model
// Usage: $adsource->total_area_color
public function getTotalAreaColorAttribute()
{
return $this->advertisements->where('color', '0')->sum('cc');
}
// Usage: $adsource->total_area_bw
public function getTotalAreaBwAttribute()
{
return $this->advertisements->where('color', '!=', '0')->sum('cc');
}
// Usage: $adsource->total_area
public function getTotalAreaAttribute()
{
return $this->advertisements->sum('cc');
}

有了这个,我认为你不需要在控制器中有任何逻辑

# Controller
public function reportBySource()
{        
$adsources = Adsource::with('advertisements')->get();
return view('pages.report.reportbysource', compact('adsources'));
}
<thead class="thead-dark">
<tr>
<th>Newspaper Name</th>
<th>Count</th>
<th>Area[Color]</th>
<th>Area[B&W]</th>
<th>Total Area(cc)</th>
</tr>
</thead>
<tbody>                                               
@foreach ($adsources as $adsource)
<tr>
<td>{{ $adsource->newspaper }}</td>
<td>{{ $adsource->advertisements->count() }}</td>
<td>{{ $adsource->total_area_color}}</td>
<td>{{ $adsource->total_area_bw }}</td>
<td>{{ $adsource->total_area }}</td>
</tr>
@endforeach
</tbody>

最新更新