Discovered reflection – nefungující detekce vazeb
- Caine
- Člen | 216
Zdravím,
narazil jsem na problém s discovered reflection (v 2.0.10 a vypadá to,
že je to i v dev), když názvy tabulek jsou v množném čísle (users),
ale referenční sloupec má tvar jednothého čísla (user_id), tak se vazba
nenajde. Při zkoumání zdrojáků jsem zjistil, že za to může https://github.com/…flection.php#L139,
nemělo by tam spíš být stripos($targetTable, $key)
nebo
rovnou oboje?
Editoval Caine (30. 5. 2013 16:02)
- Caine
- Člen | 216
No ale to je dost WTF, s kolegou jsme zabili asi hodinu, než jsme přišli na to, že se tam má použít část řetězce z cílovýho sloupce namísto názvu tabulky. Navíc, když parametry metody ref jsou $key a $throughColumn, je velice snadný si vsugerovat, že $key je vlastně název tabulky a to druhý název sloupce, přes kterej se má napojovat. Obzvlášť když většinu času děláme s konvencí jednotýho čísla, takže se tenhle problém do teď ani neprojevil, až tady u současnýho projektu, kde musíme používat konvenci s množným číslem.
- Caine
- Člen | 216
Tak jestli to nebude třeba tím, že tuhle magii jsem nikdy nepoužíval a navíc v dokumentaci (https://doc.nette.org/cs/database) je:
$rodic = $dite->ref($tableName)
Takže evidentně nejsem jediněj, koho to zmátlo.
A další věc, když by se ta podmínka rozšíříla na
stripos($column, $key) !== FALSE || stripos($targetTable, $key) !== FALSE
budou fungovat obě varianty.
A ale i tak se mi to moc nezamlouvá, protože s touhle magií bude fungovat i
$row->tra->name
$row->trans->name
$row->transl->name
atd...
- Caine
- Člen | 216
Ono to není jen o ty dokumentaci na webu, ale ani v phpdocu není zrovna moc informací, přitom aktualizovat phpdoc je daleko jednodušší než ten web.. ;/
/**
* Returns referenced row.
* @param string
* @param string
* @return ActiveRow or NULL if the row does not exist
*/
public function ref($key, $throughColumn = NULL)
- Caine
- Člen | 216
Ty to možná víš, my ostatní bohužel ne.. Já si třeba do teď myslel,
že tam je $key, protože někdo byl línej tam napsat $table, a navíc je tam
ten parameter $throughColumn, kterej přímo evokuje pocit, že $key má bejt
název tabulky. Takže pro translatora bych použil
$book->ref('author', 'translator_id')->name
…
- vvoody
- Člen | 910
Caine: ale keď zadáš druhý parameter „throughColumn“ tak ten prvý „key“ je vždy názov tabuľky. Ak „throughColumn“ neuvedieš tak sa to správa ako $row->key. Teraz keď tak nad tým rozmýšľam, nenapadá ma dôvod prečo bola metóda ref takto vytvorená, ten druhý parameter mohol byť povinný a ušetrili by sme si takéto nedorozumenia.
- hrach
- Člen | 1844
Abyste nerejpali, radej sem dnes napsal stranku do dokumentace :) Zatim v devu. https://doc.nette.org/en/database
- Stic
- Člen | 28
Caine napsal(a):
Super, akorát by bylo fajn zmínit, že takhle se to bude chovat jen pro DiscoveredReflection. Pro Conventional se to takhle chovat nebude:)
Super, konecne som nasiel aspon nieco kde je fungovanie nette/database poriadne vysvetlene. Najvacsim nepriatelom nette je podla mna to, ze dokumentacia je v hroznom stave. Bolo by napriklad fajn opisat ako by to bolo v pripade conventional reflection, a aka konvencia by sa mala pouzit na navrh nazvov tabuliek a klucov, ak planujem pouzivat databazu v nette…Pre mna ako zaciatocnika je hotova katastrofa prekusavat sa utrzkami „dokumentacie“ na fore :)