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.
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');
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() ;
Похожие вопросы
Новые вопросы
php
PHP — это открытый, мультипарадигмальный, динамически типизированный и интерпретируемый язык сценариев, изначально разработанный для веб-разработки на стороне сервера. Используйте этот тег для вопросов о программировании на языке PHP.