Vlastní Nette\Database\Reflection
- Eda
- Backer | 220
Ahoj.
Chci teď na jeden starší projekt nasadit Nette\Database a narazil jsem samozřejmě na problém, že schéma databáze vůbec neodpovídá konvencím, pro které je Nette\Database přizpůsobené. Našel jsem, že tento problém se dá řešit za pomoci vlastní implementace třídy Reflection.
Zvolil jsem řešení „zadrátovat“ si stávající tabulky přímo do PHP kódu, protože ve schématu databáze nejsou ani cizí klíče, a tak nelze použít Autodiscover. Napsal jsem funkci getPrimary (jasné – k dané tabulce mi vrátí sloupec, který je PK; btw: jak je to s tabulkami, které mají vícesloupcový PK? zatím, předpokládám, neimplementováno) a pak jsem se snažil pochopit, co mám vracet funkcí getHasManyReference. Stále ale nějak nechápu, co dostanu jako parametr a co mám vrátit.
Například v API (zde: https://api.nette.org/…lection.html#…) je v popisku funkce getHasManyReference uvedeno „Gets referenced table & referenced column“ (tzn. dostane odkazovanou tabulku a odkazovaný klíč), ale přitom v popisu parametrů je „$table – source table, $key – referencing key“ (zdrojová tabulka = podle mne odkazující; odkazující klíč) a v returnu „array(referenced table, referencing column)“ (odkazovaná tabulka, odkazující klíč).
Jak to tedy je? Co dostanu na vstupu a co mám vrátit? V jakých situacích bude tato funkce volána?
Díky moc.
Editoval Eda (22. 5. 2012 0:30)
- jtousek
- Člen | 951
Složené primární klíče skutečně implementovány nejsou. V podstatě se to řeší tak, že si přidáš další sloupec, nejčastěji id, ten dáš jako PK a na ten původní složený PK dáš unique constraint.
Nebylo by možné ty chybějící primární klíče do té databáze doplnit? Řešil jsem to na jiném projektu a po doplnění cizích klíčů a odladění několika bugů vše fungovalo správně.