Nelze přidat alias původní tabulce v metodě table

TomasA
Člen | 11
+
0
-

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

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');
?>