NDB – LEFT JOIN nad subquery

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
kolsi
Člen | 131
+
0
-

Ahoj, je nějaká možnost, jak následující SQL dotaz přepsat do Nette Database?

SELECT
    `sales_order`.*,
    SUM(`sales_order_item`.`amount_dispatched`) AS dispatched,
    SUM(t.`amount`) AS invoiced
FROM `sales_order`
LEFT JOIN `sales_order_item` ON `sales_order`.`id` = `sales_order_item`.`order_id`
LEFT JOIN (
    SELECT item_id, SUM(amount) AS amount
    FROM `sales_order_item_invoice`
    GROUP BY item_id
) t ON `sales_order_item`.`id` = t.`item_id`
GROUP BY `sales_order`.`id`

Problém mám hlavně s tím SELECTem ve druhém joinu.

	this->connection->table('sales_order')
		->select('sales_order.*')
		->select('SUM(:sales_order_item.amount_dispatched) AS dispatched')
		-> ... ???

Pokud bych přidal:

->select('SUM(:sales_order_item:sales_order_item_invoice.amount) AS invoiced')

tak to sice vytvoří funkční dotaz, ale SUM dispatched je spočítáno špatně.

CZechBoY
Člen | 3608
+
0
-

To nepřepíšeš asi v žádným orm.

kolsi
Člen | 131
+
0
-

Škoda. A možná by jenom stačilo, kdyby Nette podporovalo něco jako ->leftJoin($custom_join).

CZechBoY
Člen | 3608
+
0
-

podporuje jen custom and podminku, obcas to staci.

Svaťa Šimara
Člen | 98
+
0
-

OT:

@CZechBoY V Doctrně ano, NativeQuery a buď hydratace skaláru nebo ruční mapování

CZechBoY
Člen | 3608
+
0
-

@SvaťaŠimara dobre tak nejak normalne pres querybuilder a jednu query.

Svaťa Šimara
Člen | 98
+
0
-

@CZechBoY Asi zas dostanu strašně pozitivní hodnocení, ale opravdu si myslím, že ORM řeší mapping…

  • Napíšu hyperoptimalizovanou Query (jednu query), klidně na míru databázovému serveru
  • Řeknu ORM, jak má mapovat
  • ORM mi vrací objekty podle mapování

Mám za to, že v tomto případě ORM udělá přesně tu práci, na kterou je stavěné – mapuje výsledky dotazu na objekty. Vlastně si myslím, že toto je nejčistější (myšleno bez veškerého balastu okolo) použití ORM.

edit:
QueryBuilder a podobné nástroje jsou pouhé pomůcky, lze bez nich žít a ORM bude pořád dávat perfektní smysl.

Editoval Svaťa Šimara (10. 3. 2017 23:26)

norbe
Backer | 405
+
0
-

Prostě opodmínkuj jak se ti to má sečíst…

->select('SUM(CASE WHEN :sales_order_item:sales_order_item_invoice.id IS NULL THEN 0 ELSE :sales_order_item:sales_order_item_invoice.amount END) AS invoiced')
kolsi
Člen | 131
+
0
-

norbe: tak ono to ty faktury sečte dobře. Ale jakmile existuje více položek pro jednu fakturu, tak pak je každá položka sečtena v „dispatched“ vícekrát.