【问题标题】:Laravel: Conditional Eloquent query (Today, Month & Year)Laravel:条件 Eloquent 查询(今天、月份和年份)
【发布时间】:2020-08-26 09:13:00
【问题描述】:

我有许多必须重复的查询,因为它们取决于通过 Select (Today, Month & Year) 获得的过滤器的选择,该过滤器在上面指定的范围内显示相应的信息:当前日期、当前月份和当前年份。

代码如下:

if ($filterDashboardMerchant == 'month'){
    // Total Revenue || Month
    $totalRevenue = AffiliateOrder::join('affiliates', 'affiliates.id', '=', 'affiliates_orders.affiliate_id')
        ->whereMonth('order_date', Carbon::now()->month)
        ->select(DB::raw('sum(total) as orders_total'))
        ->where('affiliates.merchant_id', $merchant->merchant_id)
        ->get();
    }
else{
    if($filterDashboardMerchant == 'year'){
        // Total Revenue || Year
        $totalRevenue = AffiliateOrder::join('affiliates', 'affiliates.id', '=', 'affiliates_orders.affiliate_id')
            ->whereYear('order_date', Carbon::now()->year)
            ->select(DB::raw('sum(total) as orders_total'))
            ->where('affiliates.merchant_id', $merchant->merchant_id)
            ->get();
    else{
        // Total Revenue || Today
        $totalRevenue = AffiliateOrder::join('affiliates', 'affiliates.id', '=', 'affiliates_orders.affiliate_id')
            ->whereDay('order_date', Carbon::now()->day)
            ->select(DB::raw('sum(total) as orders_total'))
            ->where('affiliates.merchant_id', $merchant->merchant_id)
            ->get();
    }
}

假设所有查询代码都是相同的,其中只有 3 个条件不同:

->whereMonth('order_date', Carbon::now()->month)

->whereYear('order_date', Carbon::now()->year)

->whereDay('order_date', Carbon::now()->day)

如何在相同的代码 sn-p 中仅更改该条件,这取决于筛选到它们的 Select 中的选择?

这对我有很大帮助,因为这还不到我开发的 5%,它会为我节省大量代码。

【问题讨论】:

  • 我的回答对您的问题有帮助吗?否则我很高兴尝试修复它:)

标签: sql laravel eloquent laravel-query-builder


【解决方案1】:

Laravel 有一个 when() 查询方法,它只在条件为真时执行给定的回调。 Documentation.

AffiliateOrder::join('affiliates', 'affiliates.id', '=', 'affiliates_orders.affiliate_id')
    ->when($filterDashboardMerchant === 'day', function ($query) {
        $query->whereDay('order_date', Carbon::now()->day);
    })
    ->when($filterDashboardMerchant === 'month', function ($query) {
        $query->whereMonth('order_date', Carbon::now()->month);
    }) 
    ->when($filterDashboardMerchant === 'year', function ($query) {
        $query->whereYear('order_date', Carbon::now()->year);
    })
    ->select(DB::raw('sum(total) as orders_total'))
    ->where('affiliates.merchant_id', $merchant->merchant_id)
    ->get();

要使用更干净的方法范围,请在您的 AffiliateOrder.php 类中添加范围。

public function scopeFilterAffiliates($query, $filter) {
    $query->join('affiliates', 'affiliates.id', '=', 'affiliates_orders.affiliate_id')
        ->when($filter === 'day', function ($query) {
            $query->whereDay('order_date', Carbon::now()->day);
        })
        ->when($filter === 'month', function ($query) {
            $query->whereMonth('order_date', Carbon::now()->month);
        }) 
        ->when($filter === 'year', function ($query) {
            $query->whereYear('order_date', Carbon::now()->year);
        })
        ->select(DB::raw('sum(total) as orders_total'))
        ->where('affiliates.merchant_id', $merchant->merchant_id);
}

现在你可以像这样使用范围了。

AffiliateOrder::filterAffiliates($filterDashboardMerchant)
    ->get();

【讨论】:

    猜你喜欢
    • 2018-09-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-20
    • 1970-01-01
    • 2017-01-08
    相关资源
    最近更新 更多