SQL ниже работает нормально. Он берет это и внедряет в Laravel, где проблема. sqlfiddle можно найти здесь.

SELECT provider_id
     , o.shortName
     , count(b.site_id) as sites
     , ( select b.depositFee 
              + ( select sum(depositFee) 
                    from backhaul 
                   where backhaul.parent_id=b.id
                ) 
       ) as entranceFee
     , ( select b.rightOfWayCharges 
              + ( select sum(rightOfWayCharges) 
                    from backhaul 
                   where backhaul.parent_id = b.id
                )
       ) as rowFee
    FROM backhaul AS b
    JOIN organisation AS o  
      ON (b.provider_id = o.id)
   WHERE isnull(b.parent_id)
   GROUP 
      BY provider_id
       , entranceFee
       , rowFee

Таблица рекурсивная. Что дает мне эти результаты ниже:

--------------------------------------------------------
provider_id | sshortName | sites | entranceFee | rowFee
--------------------------------------------------------
802 | TM | 1 | 12500.00 | 7500.00  
803 | TIME | 1 | 7500.00 | 0.00

Проблема в том, что Laravel не может распознать столбцы «entranceFee» или «rowFee» в группе по утверждению.

Моя реализация Laravel 5.7 выглядит так:

$sql = DB::raw("provider_id, o.shortName, count(b.site_id) as sites," .
"(select b.depositFee + (select sum(depositFee) from backhaul where backhaul.parent_id=b.id)) as entranceFee," .
"(select b.rightOfWayCharges + (select sum(rightOfWayCharges) from backhaul where backhaul.parent_id=b.id)) as rowFee") ;

$data = DB::table("backhaul as b")->select($sql)
   ->join("organisation as o", "b.provider_id", "=", "o.id")
   ->whereNull("b.parent_id")
   ->groupBy("b.provider_id", DB::raw("entranceFee"), DB::raw("rowFee"))
   ->paginate() ;

Я получаю обычную группу MySQL по ошибке из-за отсутствия SELECT # 4 в выражении GROUP BY.

Я попытался добавить в виде массива groupBy(["provider_id", DB::raw("entranceFee"), DB::raw("rowFee")]), но все равно это barfs. Если я добавлю также и встроенные SQL-выражения, это barfs.

1
Anthony 16 Авг 2019 в 13:56

2 ответа

Лучший ответ

Ответ был дан на Laracasts от Tray2:

Приведенное ниже решение подтверждено для работы:

$data = DB::select('SELECT provider_id
     , o.shortName
     , count(b.site_id) as sites
     , ( select b.depositFee 
              + ( select sum(depositFee) 
                    from backhaul 
                   where backhaul.parent_id=b.id
                ) 
       ) as entranceFee
     , ( select b.rightOfWayCharges 
              + ( select sum(rightOfWayCharges) 
                    from backhaul 
                   where backhaul.parent_id = b.id
                )
       ) as rowFee
    FROM backhaul AS b
    JOIN organisation AS o  
      ON (b.provider_id = o.id)
   WHERE isnull(b.parent_id)
   GROUP 
      BY provider_id
       , entranceFee
       , rowFee');
1
Anthony 21 Авг 2019 в 15:10

Laravel, вероятно, оборачивает те в обратные метки, что заставит MySQL считать, что они являются настоящими столбцами в таблице где-то. Попробуйте также обернуть их в DB::raw.

$data = DB::table("backhaul as b")->select($sql)
    ->join("organisation as o", "b.provider_id", "=", "o.id")
    ->whereNull("b.parent_id")
    ->groupBy([
        "b.provider_id",
        \DB::raw('entranceFee'),
        \DB::raw('rowFee'),
    ])
    ->paginate() ;
-1
user1669496 16 Авг 2019 в 15:20