是否有 "Laravel" 执行以下代码的方法?

Is there "Laravel" way for executing following code?

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

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++;
}

观点table如下

<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'));
} 

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

adsource_id是外键; table 包含(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>