对于laravel中的每个地方,正确的方法是什么?



我有下面这两个函数。我想把$report->rate改为结果计数。那么这个查询foreach($campaign->reports->where('status', 2)的总行数如果有10个结果为真那么它就是$total_cap = $total_cap + 10;

public static function checkTotalCap(Campaign $campaign)
{
$total_cap = 0;
foreach($campaign->reports->where('status', 2) as $report)
{
$total_cap = $total_cap + $report->rate;
}
if($campaign->cap <= $total_cap)
return true;
return false;
}
public static function checkDailyCap(Campaign $campaign)
{
$daily_cap = 0;
foreach($campaign->reports->where('status', 2) as $report)
{
if($report->created_at->isToday())
{
$daily_cap = $daily_cap + $report->rate;
}
}
if($campaign->daily_cap <= $daily_cap)
return true;
return false;
}

这就是它的用法

if($campaign->cap !== 0)
{
// Check if total cap or daily cap reached
if($this->checkTotalCap($campaign) || $this->checkDailyCap($campaign))
{
$campaign->active = 'no';
$campaign->save();
return "The campaign has reached its cap.";
}
}

这很简单

$reports = $campaign->reports()->where('status', 2)->whereDate('created_at', now())->get();
foreach($reports as $report)
{
$daily_cap = $daily_cap + $report->rate;
}

编写单独的带有条件的查询,并简单地循环。

您可以尝试过滤status == 2和:

的报告。
$reports = $campaign->reports()->where('status', 2)->get();
foreach($reports as $report) {
//TODO
}

这里甚至不需要foreach()循环:

public static function checkTotalCap(Campaign $campaign) {
return $campaign->reports()->where('status', 2)->count() > $campaign->cap;
// OR
// $campaign->cap <= return $campaign->reports()->where('status', 2)->count();
}
public static function checkDailyCap(Campaign $campaign) {
return $campaign->reports()->where('created_at', Carbon::today())->where('status', 2)->count() > $campaign->daily_cap;
// OR
// return $campaign->daily_cap <= $campaign->reports()->where('created_at', Carbon::today())->where('status', 2)->count();
}

使用sql级查询获取每个Report的rate列的SUM,并与$campaign->cap进行比较。

相关内容

最新更新