Nefunguje ->find() nad backjoinovanou Selection
- mkoubik
- Člen | 728
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)
- Eda
- Backer | 220
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
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)