简体   繁体   中英

How do i write the following Query in laravel

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 gr oup 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?

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'
)

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.

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               
")

. 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, ie . with ``

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM