Имееться:
- php MVC самописанный фреймворк для проекта.
- БД (PostgreeSql)
В проекте часто используються сложные выборки с LEFT JOIN и агрегирующими функциями, вложенными запросами и MATERIALIZED VIEW.
От QueryBuilder было решено откаказаться, при таких длинныз запросах его испозльзовать показалось сложным.
Используем PDO.
Посоветуйте в какое место лучше выносить SQL код, с последующим удобным к нему доступом, чтобы не писать его в контроллере или не раздувать модели функциями в которых будет написан SQL ?
Пример кода:
WITH events AS (SELECT "id","time","Seria__id","url","Event_Type__id"
FROM "event" WHERE "time">? AND "Event_Status__id"=?)
SELECT "e"."id" AS "event.id",
min("e"."time") AS "event.time",
min("e"."Seria__id") AS "event.Seria__id",
min("e"."Event_Type__id") AS "event.Event_Type__id",
min("e"."url") AS "event.url",
array_to_string(array_agg("p"."name" ORDER BY "e_p"."owner" DESC),?) AS "partaker.name",
array_to_string(array_agg("p"."orig_url" ORDER BY "e_p"."owner" DESC),?) AS "partaker.orig_url",
array_to_string(array_agg("p"."small_url" ORDER BY "e_p"."owner" DESC),?) AS "partaker.small_url",
min("p_e"."price_rub") AS "product_event.price_rub",
min("p_e"."analytics") AS "product_event.analytics",
min("p_e"."id") AS "product_event.id",
min("o"."id") AS "order.id"
FROM "events" "e"
LEFT JOIN "event_partaker" "e_p"
ON "e"."id"="e_p"."Event__id"
LEFT JOIN "partaker" "p"
ON "p"."id"="e_p"."Partaker__id"
LEFT JOIN "product_event" "p_e"
ON "e"."id"="p_e"."Event__id"
LEFT JOIN "order" "o"
ON ("o"."model_id"="p_e"."id" AND "model_name"=? AND "paid"=1 AND "User__id"=?)
WHERE "p_e"."active"=1
GROUP BY 1
ORDER BY "event.time