Laravel 6 запрос к той же таблице с другим предложением где - PullRequest
0 голосов
/ 04 мая 2020

У меня есть 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 равен $ вчера.

Наряду с этим запросом я также хочу получить значение cost каждой кампании, где report_date - это позавчерашний день, соответствующий столбцу campaignId. Я хочу показать разницу в cost между вчерашними и позавчерашними кампаниями.

подобно

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

Может ли кто-нибудь помочь мне в создании этого запроса с помощью Query Builder или Eloquent?

Ответы [ 2 ]

1 голос
/ 04 мая 2020

Группировка по дате (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');
1 голос
/ 04 мая 2020

Вы можете написать отношение в вашей модели 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;
}

Теперь вы можете вернуть $campaignReports с отношением lastDayDifference, например:

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

В конце у вас есть один объект, прикрепленный к каждому вашему $campaignReport

...