Home > Back-end >  LARAVEL count with conditions
LARAVEL count with conditions

Time:07-18

I have a table called transactions I get data from it as statistics grouped by year and month and total but I need get also success and failed depend on state field.

the issue here is that the success and field return same value of total, like that

{
"count": 36,
"success": 36,
"failed": 36,
"date": "01-2022",
"year": 2022,
"month": 1
},

the logic is

return $this->transactions()
            ->select(
                DB::raw('count(state) as count'),

                DB::raw('count( state="success" ) as success'),
                DB::raw('count( state!="success" ) as failed'),
                
                DB::raw("DATE_FORMAT(created_at, '%m-%Y') as date"),
                DB::raw('YEAR(created_at) year, MONTH(created_at) month')
            )

            ->where(function ($query) use ($start, $end) {
                return $query->where('created_at', '>=', $start)
                    ->orWhere('created_at', '>=', $end);
            })

            

            ->groupBy('year', 'month')
            ->orderBy('created_at', 'asc')
            ->get();

CodePudding user response:

you can use this :

$this->transactions()
    ->select(
        DB::raw('count(state) as count'),

        DB::raw('SUM(case when state = "success" then 1 else 0 end) as success'),

        DB::raw('SUM(case when state != "success" then 1 else 0 end) as failed'),

        DB::raw("DATE_FORMAT(created_at, '%m-%Y') as date"),
        DB::raw('YEAR(created_at) year, MONTH(created_at) month')
    )

    ->where(function ($query) use ($start, $end) {
        return $query->where('created_at', '>=', $start)
            ->orWhere('created_at', '>=', $end);
    })



    ->groupBy('year', 'month')
    ->orderBy('created_at', 'asc')
    ->get();

reformat your query to

        $this->transactions()
        ->selectRaw(
            '
                count(state) as count,
                SUM(case when state = "success" then 1 else 0 end) as success,
                SUM(case when state != "success" then 1 else 0 end) as failed,
                DATE_FORMAT(created_at, "%m-%Y") as date,
                YEAR(created_at) year, MONTH(created_at) month
            '
        )
        ->where('created_at', '>=', $start)
        ->orWhere('created_at', '>=', $end)
        ->groupBy('year', 'month')
        ->orderBy('created_at')
        ->get();
  • Related