Nefunguje ->find() nad backjoinovanou Selection

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

Nevím jestli je to bug, nebo feature (jestli to používám špatně), ale (na databázi z testů) nefunguje

$connection->table('author')->where('book:translator_id IS NOT NULL')->find(12)

Chci vybrat autory, kteří mají nepřeložené knížky a pak z nich vybrat autora s id 12. Ale místo author.id se do WHERE dosadí jen id, což způsobí chybu:
SQLSTATE[23000]: Integrity constraint violation: 1052 Column 'id' in where clause is ambiguous
vygeneruje se:

SELECT `author`.* FROM `author`
INNER JOIN `book` ON `author`.`id` = `book`.`author_id`
WHERE (`book`.`translator_id` IS NOT NULL) AND (`id` = ?)'

Ve své aplikaci to používám jako

$conn->table('video_categories')->where('videos:published', true)->get('1');

což je stejný případ.

Vytvořil jsem naivní opravu: https://github.com/…tte/pull/823, ale asi by to chtělo řešit nějak líp.


PHP 5.3.10, aktuální Nette z gitu.

Editoval mkoubik (15. 10. 2012 15:26)

enumag
Člen | 2118
+
0
-

Je to prostě chování NDB, někde už jsem tu viděl návrh, že by se při nespecifikované tabulce automaticky doplnil název tabulky daného $selection. Opravu by to chtělo obecnější aby to pokrylo i použití víceznačného názvu sloupce v libovolné klauzuli.

mkoubik
Člen | 728
+
0
-

Kdybych použil ->where('id', 1), tak to chápu, ale metoda ->find(1) si tu podmínku sestavuje sama a já nemám jak jí podstrčit název tabulky.

Eda
Backer | 220
+
0
-

Ano, je to přesně to, co jsem zmiňoval tady: https://forum.nette.org/…nou-kolonkou

Mnohem logičtější by bylo, kdyby vyhledávací sloupce s nespecifikovanou tabulkou byly automaticky z primární tabulky selection. K navázaným sloupcům stejně musíme (dnes jen minimálně u jednoho…) jejich tabulku uvést.

Takto totiž může ->where('id', 5) znamenat něco jiného v závislosti na tom, podle jakých dalších (třeba i navázaných) kolonek vyhledáváte. A to je docela zákeřné a myslím, nepožadované chování.

A stejné chování u ->find() to jen potvrzuje…

mkoubik
Člen | 728
+
0
-

Zkusím tohle znovu otevřít.
Aby bylo jasno, nejde mi o nějaký syntactic sugar – pokud bych používal ->where('id', 5), tak nemám nejmenší problém to přepsat na ->where('table.id', 5).
Problém je, když z nějakého modelu dostanu selection a chci přistoupit k jejímu řádku. Pak použiju ->find(5) a čekal bych že dostanu záznam s id 5. Nicméně to nefunguje a já nemám jak tam ten název tabulky dostat (nehledě na to, že NDB už tuhle informaci má).

Editoval mkoubik (26. 10. 2012 16:34)