我有下面这两个函数。我想把$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
进行比较。