Be part of JetBrains PHPverse 2026 on June 9 – a free online event bringing PHP devs worldwide together.

TuffRivers's avatar

Best way to combine query builder results?

Hi All,

I am breaking down an old SQL View that summarizes a transaction table for clients across different date ranges.

Ive recreated these smaller views into query builder laravel queries, and now i need to combine them (multi-dimensional array with date ranges as keys, then client name/sum as k => v pair) i know i can do this with a foreach - but wondering in general if thre is a better way to write these queries and combine them (maybe collections & map ?)

Thanks

        $today = DB::table('Client_Accounts as c')
        ->leftJoin('Client_Transactions as t', 't.ClientID', 'c.ClientID')
        ->select(
            'Client_Name as Client',
            DB::RAW('SUM(t.Transaction) as today')
        )->where('t.Transaction', '<', 0)
        ->whereDay('t.Timestamp', Carbon::now()->day)
        ->whereMonth('t.Timestamp', Carbon::now()->month)
        ->whereYear('t.Timestamp', Carbon::now()->year)
        ->groupBy('c.Client_Name')
        ->get();

        $yesterday = DB::table('Client_Accounts as c')
        ->leftJoin('Client_Transactions as t', 't.ClientID', 'c.ClientID')
        ->select(
            'Client_Name as Client',
            DB::RAW('SUM(t.Transaction) as yesterday')
        )->where('t.Transaction', '<', 0)
        ->whereDay('t.Timestamp', Carbon::now()->subDays(1))
        ->whereMonth('t.Timestamp', Carbon::now()->month)
        ->whereYear('t.Timestamp', Carbon::now()->year)
        ->groupBy('c.Client_Name')
        ->get();

        $this_week = DB::table('Client_Accounts as c')
        ->leftJoin('Client_Transactions as t', 't.ClientID', 'c.ClientID')
        ->select(
            'Client_Name as Client',
            DB::RAW('SUM(t.Transaction) as this_week')
        )->where('t.Transaction', '<', 0)
        ->whereBetween('t.Transaction', [Carbon::now()->StartOfWeek(Carbon::MONDAY)->format('Y-m-d'), Carbon::now()->endOfWeek(Carbon::SATURDAY)->format('Y-m-d')])
        ->groupBy('c.Client_Name')
        ->get();
  
        $this_month = DB::table('Client_Accounts as c')
        ->leftJoin('Client_Transactions as t', 't.ClientID', 'c.ClientID')
        ->select(
            'Client_Name as Client',
            DB::RAW('SUM(t.Transaction) as this_month')
        )->where('t.Transaction', '<', 0)
        ->whereMonth('t.Timestamp', Carbon::now()->month)
        ->whereYear('t.Timestamp', Carbon::now()->year)
        ->groupBy('c.Client_Name')
        ->get();

        $this_year = DB::table('Client_Accounts as c')
        ->leftJoin('Client_Transactions as t', 't.ClientID', 'c.ClientID')
        ->select(
            'Client_Name as Client',
            DB::RAW('SUM(t.Transaction) as this_year')
        )->where('t.Transaction', '<', 0)
        ->whereYear('t.Timestamp', Carbon::now()->year)
        ->groupBy('c.Client_Name')
        ->get();

        $all_time = DB::table('Client_Accounts as c')
        ->leftJoin('Client_Transactions as t', 't.ClientID', 'c.ClientID')
        ->select(
            'Client_Name as Client',
            DB::RAW('SUM(t.Transaction) as all_time')
        )->where('t.Transaction', '<', 0)
        ->groupBy('c.Client_Name')
        ->get();
0 likes
2 replies
SilenceBringer's avatar
Level 55

@tuffrivers the best way is to rewrite query to get all results at once

$all_time = DB::table('Client_Accounts as c')
        ->leftJoin('Client_Transactions as t', 't.ClientID', 'c.ClientID')
        ->select(
            'Client_Name as Client',
            DB::raw('sum(t.Transaction) as all_time'),
            DB::raw('sum(if(date(t.Timestamp) = curdate(), t.Transaction, 0)) as today'),
            DB::raw('sum(if(date(t.Timestamp) = date_sub(curdate(), interval 1 day), t.Transaction, 0)) as yesterday'),
            DB::raw('sum(if(week(t.Timestamp) = week(curdate()), t.Transaction, 0)) as this_week'),
            DB::raw('sum(if(year(t.Timestamp) = year(curdate()) and month(t.Timestamp) = month(curdate()), t.Transaction, 0)) as this_month'),
        )->where('t.Transaction', '<', 0)
        ->groupBy('c.Client_Name')
        ->get();

MySQL can do everything for you

(possible some missing brackets, check it carefully)

1 like
TuffRivers's avatar

@silencebringer Thanks! Thats basically what im doing in the mysql just wondering if there was a more "laravelly" way to do it

Please or to participate in this conversation.