【问题标题】:Laravel 6 query same table with different where clauseLaravel 6用不同的where子句查询同一张表
【发布时间】:2020-08-18 12:57:05
【问题描述】:

我有campaign_report这样的表

Schema::create('campaign_report', function (Blueprint $table) {
    $table->bigIncrements('id');
    $table->date('report_date');
    $table->bigInteger('user_id');
    $table->bigInteger('campaignId');
    $table->double('cost',12,2);
    $table->timestamps();
});

我正在尝试获取昨天的所有活动报告。

        $campaignReports = CampaignReport::where(['report_date' => "$yesterday", 'user_id' => Auth::user()->id])->orderBy('report_date', 'desc')->paginate(25);

以上查询返回所有 report_date 等于 $yesterday 的广告系列。

除了这个查询,我还想获取每个活动的cost 值,其中report_date 是前天匹配campaignId 列。我想显示昨天的广告系列和前天的广告系列之间cost 的区别。

喜欢

foreach($campaignReports as $campaignReport)
{
    $difference = $campaignReport->cost - $campaignReport->dayBeforeYesterdayCost; 
}

谁能帮助我使用 Query Builder 或 Eloquent 构建这个查询?

【问题讨论】:

  • 写两个查询得到昨天的成本和前天的成本并相减有什么问题?
  • 非常感谢您的评论。是的,我可以在 foreach 循环中进行另一个查询来查询 costDayBeforeYesterday。但我是在单个查询中考虑的。

标签: php mysql laravel laravel-6 laravel-query-builder


【解决方案1】:

您可以在 CampaignReport 模型中编写一个关系,计算昨天和前一天的成本之间的差异

public function dayBeforeYesterdayCost() {
     $dayBeforeYesterday = Carbon::parse($this->report_date)->subDays(1); //return date of day before yesterday

     $dayBeforeYesterdayCost = CampaignReport::where('campaignId', $this->campaignId)
     ->where('report_date', $dayBeforeYesterday)
     ->first();

     return $dayBeforeYesterdayCost ? $dayBeforeYesterdayCost->cost : 0;
}


public function lastDayDifference() {
     $difference = $this->cost - $this->dayBeforeYesterdayCost; 
     return $difference;
}

现在您可以像这样返回 $campaignReportslastDayDifference 关系:

 $campaignReports = CampaignReport::where(['report_date' => "$yesterday", 'user_id' => Auth::user()->id])
->with('lastDayDifference')
->orderBy('report_date', 'desc')
->paginate(25);

最后,您的每一个$campaignReport 都附加了一个对象

【讨论】:

  • 谢谢@Mohammad Hosseini。问题是我在“campaign_report”表中没有“dayBeforeYesterdayCost”列。我想在查询中分配这个值。
  • @AmandeepSingh 我已经更新了我的答案并在模型中添加了dayBeforeYesterdayCost。请检查。如果$dayBeforeYesterday 将日期作为时间戳返回并且您在report_date 中的日期格式不同,您可以在$dayBeforeYesterday 末尾使用->format('Your format')
【解决方案2】:

按日期分组(report_date),它只会给你日期部分,按相同的降序排列,然后只取昨天和前一天的值。比如:

CampaignReport::select(DB::raw('date(report_date) report_date', DB::raw('count(*) as count'))
    ->where('report_date','>=',$twoDaysAgo) 
    ->where('user_id', Auth::user()->id])
    ->groupBy('report_date')
    ->orderBy('report_date', 'desc');

【讨论】:

  • 谢谢你的回答。 'report_date' 已经在 where 子句中。我可以弄清楚它是如何工作的。
  • 把它从查询中取出,或者使用 Carbon 来获取按日期分组的最后两天。我将编辑我的答案以添加一个示例。
猜你喜欢
  • 2019-05-08
  • 2021-10-20
  • 2014-12-01
  • 1970-01-01
  • 2014-09-29
  • 1970-01-01
  • 1970-01-01
  • 2017-12-10
  • 2018-11-25
相关资源
最近更新 更多