Nette database – sql dotaz
- ondrej256
- Člen | 187
Zdravím,
dokumentaci jsem si přečetl, ale nemůžu to dát dohromady.
Dokázali by jste zapsat v Nette/Database sql dotaz:
$this->database->query("
SELECT *
FROM product p JOIN subcategory s ON p.subcategory_id = s.subcategoryId JOIN category c ON s.category_Id = c.categoryId
WHERE $polePodminek
LIMIT $offset, $limit");
//
Nevím si rady jak to zapsat
- ondrej256
- Člen | 187
Kcko napsal(a):
Dokázali by jste zapsat v Nette/Database sql dotaz:
Dokázali. Co jsi zatím vytvořil?
$products = $this->database->table("product")->where($podminky)->limit($offset,$limit);
pak už vůbec nevím jak to spojovat, používal jsem rel(), ale to jde jen na jeden řádek
Editoval ondrej256 (18. 8. 2014 20:29)
- Kcko
- Člen | 469
Něco ve smyslu
$this->database->table("product")
->select("subcategory.id")
->select("subcategory.category.id")
->where($podminky)
->limit($offset, $limit)
->fetchAll();
Ale přejmenuj si ty sloupečky (resp. jestli je nemáš jako cizí klíče).
Ta konvence by měla být jako
produkt
id |subcategory_id
subcategory
id | category_id
category
id
Jinak by Ti měla stačit jen 1 tabulka na kategorie
category
id | name | category_parent
- Kcko
- Člen | 469
hrach
Co je na tom špatně? Imho to funguje, akorát to bude generovat takto LEFT
JOINy a ne INNER JOINy (NDT ještě moc dobře neznám, čím to přepnu?)
Samozřejmě to půjde zapsat přímo přes spojovací klíče, ale kdyby chtěl
filtrovat nebo omezovat už na úrovni SQL dotazu a ne až v šablone (tak jak
je to popsáno v docce), tak to jinak neudělá, nebo se pletu?
Editoval Kcko (18. 8. 2014 21:07)
- Kcko
- Člen | 469
hrach napsal(a):
Filozofie ndb je vybirat jednim dotazem data jen z jedne tabulky. viz. dokumentace.
Ano, ale nevíme jestli zakladatel topicu, nechce do $where podmínky dávat něco z vedlejších tabulek, pak by to nešlo ;)
EDIT: Blbost jsem napsal. Stačilo by to pak skutečně nacpat jen do WHERE.
PS. Co ty LEFT JOINy? Jsem si to zkoušel a rád bych to nějak přepnul na INNER JOINy. Lze?
Editoval Kcko (18. 8. 2014 22:03)
- ondrej256
- Člen | 187
Ještě potřebuju pomoct
Pokud napíšu toto:
$this->database->table($this->primaryTable)->select("subcategory.id")->select("subcategory.category.id")->order($order)->limit($limit, $offset);
tak se vygeneruje
SELECT `subcategory`.`id`, `category`.`id`
FROM `product`
LEFT JOIN `subcategory` ON `product`.`subcategory_id` = `subcategory`.`subcategoryId`
LEFT JOIN `category` ON `subcategory`.`category_id` = `category`.`categoryId`
ORDER BY `productId` DESC
LIMIT 10
OFFSET 1
jak mně bylo řečeno je zvykem mí tabulky
produkt
id |subcategory_id
subcategory
id | category_id
category
id
a mám je v této formě.
Jenže v SQL dotazu se generuje „subcategoryId“ místo „id“.
A ano do where chci napsat podmínku, která bude vybírat produkty podle kategorie. Už jsem teda zjistil, že to bude lepší psát do where, ale to je teď jedno. Dělá to stejnou chybu jako v tomto případě.
Proč se generuje špatný název sloupce?