Jak udělat join a sum v NotORM

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

Ahoj, chci se zeptat jak pomocí NotORM zapsat tento SQL dotaz. Nějak jsem nepochopil jak dělat ty joiny a sum. Bez těch joinů by se to ale obešlo díky cizím klíčům, že?
Ty cizí klíče jsou pro mě ještě taková trochu záhada…
Díky Dan

Select sum(cena) from jidelniListek join objednavka_jidelniListek ON jidelniListek.id = objednavka_jidelniListek.id_jidelniListek
                            join objednavka on objednavka.id = objednavka_jidelniListek.id_objednavka
where objednavka_jidelniListek.id_objednavka = 28;
kloban
Člen | 123
+
0
-

Tak se v tom trochu snažím zorientovat a hodil by se mi dump dotazu SELECT * FROM objednavka WHERE …neco…

Zkouším toto, ale jsem asi mimo (Call to undefined method Nette\Database\Table\Selection::dump()).

print_r($this->database->table('objednavka')->dump());
tomas.lang
Člen | 53
+
0
-

Ahoj,

trochu se zde motají pojmy NotORM a Nette\Database – NDb sive vychází z NotORM, ale liší se např. syntaxí (či spíše API), v Nette 2.1 je tam těch změn pak již více.

Cizí klíče jsou pro NdB důležité aby poznal přes co má JOINovat (pokud nepoužiješ jako reflexi Nette\Database\Reflection\ConventionalReflection, pak se očekává konkrétní konvence při pojmenování sloupců a tabulek.

Pokud budeme přepokládat, že budeš mít v DB nastavené vizí klíče (neboť od pohledu se tvá struktura neshoduje s ConventionalReflection), pak by dotaz mohl vypadat následovně:

<?php
$database->table('jidelniListek')
    ->where('objednavka_jidelniListek:id_objednavka', 28)
    ->sum('cena');
?>

Dotaz je psaný pro Nette 2.0.x, u 2.1 by tam byla změna u té where podmínky na where(‚:objednavka_jidelniListek.id_objednavka‘, 28).

Sloupeček cena nevím odkud máš braný, pokud je z té tabulky objednavka, tak by ještě byla změna v té metodě sum() na sum(‚objednavka_jidelniListek:objednavka.cena‘) (opět psáno pro Nette 2.0.x).

Místo print_r($this->database->table(‚objednavka‘)->dump()); zkus použít print_r($this->database->table(‚objednavka‘)->getSql());

Pro podrobnější informace bych případně odkázal na následující video: http://www.youtube.com/watch?….

Editoval tomas.lang (15. 3. 2014 15:40)

kloban
Člen | 123
+
0
-

Díky za video.
Potřebuju propojit celkem 3 tabulky a nedaří se. Prosím tedy ještě o radu, příkládám erd (http://moje.schoula.cz/erd.png).

Potřebuji vlastně vypsat všechny nezaplacené položky z jídelního lístku, které patří k určité objednávce. Nakonec potřebuju znát celkovou sumu cen.

A nakonec se ještě zeptám. Co jsem tak četl, tak všichni na Nette/Database spíše nadávají. Má cenu se to tedy učit, nebo rovnou začít používat Doctrinu. Na druhou stranu jestli je Doctrina na pochopení obtížnější, tak bude asi lepší na ni přejít později, co myslíte?