Nette database – sql dotaz

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

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

Kcko
Člen | 469
+
0
-

Dokázali by jste zapsat v Nette/Database sql dotaz:
Dokázali. Co jsi zatím vytvořil?

ondrej256
Člen | 187
+
0
-

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
+
0
-

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

hrach
Člen | 1838
+
0
-

a dokumentaci si cetl??? to, co pise kcko, je mozna funkcni, ale neni to uplne ta spravna cesta, jak to pouzivat. viz opet dokumentace.

Kcko
Člen | 469
+
+1
-

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)

hrach
Člen | 1838
+
0
-

Filozofie ndb je vybirat jednim dotazem data jen z jedne tabulky. viz. dokumentace.

Kcko
Člen | 469
+
0
-

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)

Mysteria
Člen | 797
+
0
-

Pokud vím tak ne, dělá se vždy LEFT join.

ondrej256
Člen | 187
+
0
-

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?

vvoody
Člen | 910
+
+1
-

Zmaž cache ak si priebežne menil názvy stĺpcov. Ak nepomôže tak nám ukáž kompletný sql dump tabuliek.

ondrej256
Člen | 187
+
0
-

vvoody napsal(a):

Zmaž cache ak si priebežne menil názvy stĺpcov. Ak nepomôže tak nám ukáž kompletný sql dump tabuliek.

super, smazaní cache pomohlo. dík