Home > Mobile >  How do i write the following Query in laravel
How do i write the following Query in laravel

Time:02-24

I have this Query which i am trying to execute

$other = $this->electricityConnections->select('category_id')
    ->from('building_category_settings')
    ->where('building_id', '=', 52)
    ->where('hide_from_electricity_widget', '=', 1)
    ->groupBy('category_id')
    ->orderBy('kwh_used', 'desc');

$electCategory = $this->electricityConnections
    ->addselect(('MIN(IF(category.description IS NOT NULL, 
    category.description, your_electricity_yesterday_category.cat_desc) 
            as cat_desc'),
        ('SUM(kwh_used) as kwh_used'), ('SUM(cost) as cost'),
        'your_electricity_yesterday_category.category_id')
    ->leftJoin('category as category',
        'your_electricity_yesterday_category.category_id', '=', 'category.id')
    ->where('your_electricity_yesterday_category.category_id', '=', 11)
    ->where('your_electricity_yesterday_category.building_id', '=', 52)
    ->whereNotIn('your_electricity_yesterday_category.category_id', $other)
    ->get();
dd($electCategory);

But i keep getting this error

"message": "SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '.cat_desc) as cat_desc, SUM(kwh_used) as kwh_used, SUM(cost) as cost' at line 1 (SQL: select MIN(IF(category.description IS NOT NULL, category.description, your_electricity_yesterday_category.cat_desc) as cat_desc, SUM(kwh_used) as kwh_used, SUM(cost) as cost, your_electricity_yesterday_category.category_id from your_electricity_yesterday_category left join category as category on your_electricity_yesterday_category.category_id = category.id where your_electricity_yesterday_category.category_id = 11 and your_electricity_yesterday_category.building_id = 52 and your_electricity_yesterday_category.category_id not in (select category_id from building_category_settings where building_id = 52 and hide_from_electricity_widget = 1 group by category_id order by kwh_used desc))",

When I do toSql() to the code above I get the following below

"select `MIN(IF(category`.`description IS NOT NULL, category`.`description, your_electricity_yesterday_category`.`cat_desc)` as `cat_desc`, `SUM(kwh_used)` as `kwh_used`, `SUM(cost)` as `cost`, `your_electricity_yesterday_category`.`category_id` from `your_electricity_yesterday_category` left join `category` as `category` on `your_electricity_yesterday_category`.`category_id` = `category`.`id` where `your_electricity_yesterday_category`.`category_id` = ? and `your_electricity_yesterday_category`.`building_id` = ? and `your_electricity_yesterday_category`.`category_id` not in (select `category_id` from `building_category_settings` where `building_id` = ? and `hide_from_electricity_widget` = ? group by `category_id` order by `kwh_used` desc)"

What am i doing wrong?

CodePudding user response:

I think the main problem is the addSelect part. You're missing a closing ) for MIN. Try using DB::raw when the selected columns include sql functions.

addselect(
    DB::raw('MIN(IF(category.description IS NOT NULL, category.description, your_electricity_yesterday_category.cat_desc)) as cat_desc'),
    DB::raw('SUM(kwh_used) as kwh_used'),
    DB::raw('SUM(cost) as cost'), 
    'your_electricity_yesterday_category.category_id'
)

CodePudding user response:

you are missing parentheses from end of below line

MIN(IF(category.description IS NOT NULL, category.description, your_electricity_yesterday_category.cat_desc)) as cat_desc 

you need to close bracket before as cat_desc, this seems to be syntax issue.

CodePudding user response:

You Can Use selectRaw, check docs: https://laravel.com/docs/9.x/queries#selectraw

->selectRaw("
    MIN(IF(category.description IS NOT NULL, category.description, your_electricity_yesterday_category.cat_desc)) as cat_desc),
    SUM(kwh_used) as kwh_used,
    SUM(cost) as cost), 
    your_electricity_yesterday_category.category_id               
")

CodePudding user response:

. is a keyword in SQL. You may not used it as a column name without quoting it. In MySQL, things like column names are quoted using backticks, i.e. . with ``

Personally, I wouldn't bother; I'd just rename the column.

  • Related