Nelze přidat alias původní tabulce v metodě table
- TomasA
- Člen | 11
Dobrý den,
mám problém s vytvářením některých dotazů do databáze. Dostávám
chybu „Ambiguous column“ pro sloupeček id. Problém je v tom, že
v jednom dotazu používám více tabulek, které mají sloupeček ‚id‘.
Nemám ale možnost, jak definovat, že požadovaný sloupeček ‚id‘ patří
původní tabulce, na kterou se dotazuji.
Ukážu příklad:
Mám následující tabulky:
sections (id, name, setting_id, …)
settings (id, type, …)
Vyfiltroval jsem nějakým způsobem id sekcí, které chci dále omezit na určitý typ (setting.type). Příkaz
<?php
$context->table('sections')->where('id', [1,2])->where('setting.type IS NOT NULL');
?>
vygeneruje dotaz:
`SELECT „sections“.* FROM „sections“
LEFT JOIN „public“.„settings“ „setting“ ON
„sections“.„setting_id“ = „setting“.„id“
WHERE („id“ IN (1, 2)) AND („setting“.„type“ IS NOT NULL)`
PostgreSQL v tomto případě hlásí chybu „Ambiguous column“ kvůli sloupečku id.
Já samozřejmě vím, že by v tomto případě stačilo přidat alias na tabulku „sections“ a upravit dotaz následovně:
<?php
$context->table('sections', 's')->where('sections.id', [1,2])->where('setting.type IS NOT NULL')
?>
`SELECT „s“.* FROM „sections“ AS s
LEFT JOIN „public“.„settings“ „setting“ ON
„sections“.„setting_id“ = „setting“.„id“
WHERE (s.„id“ IN (1, 2)) AND („setting“.„type“ IS NOT NULL)`
Nicméně Nette mi nic podobného neumožní. Původní tabulce v metodě
table
nelze přidat alias.
Do této chvíle (přechodu na Nette 3.0) jsem používal následující nepěknou, ale funkční konstrukci:
<?php
$context->table('sections')->where('sections.id', [1,2])->where('setting.type IS NOT NULL');
?>
Ta ale v aktuální verzi generuje chybu:
Do not prefix table chain with origin table name ‚sections‘. If you want to make self reference, please add alias.
Což o to, alias já bych vyrobil rád, ale funkce table
tento
parametr nevyžaduje a funkci alias
nelze aplikovat na tabulku
‚sections‘.
<?php
$context->table('sections')->alias('sections', 's')->where('sections.id', [1,2])->where('setting.type IS NOT NULL');
?>
Tento příkaz vygeneruje dotaz s přidaným LEFT JOIN:
`SELECT „sections“.*
FROM „sections“
LEFT JOIN „s“ ON . = „s“.
LEFT JOIN „public“.„settings“ „setting“ ON
„sections“.„setting_id“ = „setting“.„id“
WHERE („s“.„id“ IN (1, 2)) AND („setting“.„type“ IS
NOT NULL)`
Což je evidentně špatně.
Mohli byste mi, prosím poradit, jak tuto situaci vyřešit?
Používám Nette 3.0 a PostgreSQL 10 a 12.
Děkuji.
- TomasA
- Člen | 11
UPDATE:
Funkce s jménem tabulky před sloupečkem funguje a nehlásí chybu:
<?php
$context->table('sections')->where('sections.id', [1,2])->where('setting.type IS NOT NULL');
?>
Moje chyba byla v tom, že jsem ji nesprávně uváděl i na místech, kde nebyla nutná:
<?php
$context->table('sections')->where('sections.id', [1,2])->where('sections.setting.type IS NOT NULL');
?>