Discovered reflection – nefungující detekce vazeb

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
Caine
Člen | 216
+
0
-

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)

vvoody
Člen | 910
+
0
-

Zabudol si uviesť kód, ktorý ti nefunguje.

hrach
Člen | 1844
+
0
-

No, ocividne volas

$row->users->name

misto

$row->user->name

To users, respektive user nema byt cilova tabulka, ale klic, ze ktere se odvodi spojovaci sloupec, viz moje posledni prednaska, ktera teda jeste neni online.

Caine
Člen | 216
+
0
-

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.

hrach
Člen | 1844
+
0
-

Presne o tomto celem byla moje prednaska na posledni sobote. Wtf to neni, jak bys asi pak resit $row->translator->name, kdyz by se to melo resolvovat pres cilovou tabulku, ze… ale na to si snad nekdy prijdes sam.

Caine
Člen | 216
+
0
-

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...
hrach
Člen | 1844
+
0
-

Ach ano. Ta dokumentace je spatne :| ja ji nikdy necetl ani nepsal, tak … to jdu aspon z toho dat pryc…

Ohledne dvojite podminky… mno… to si musim promyslet, zatim na tom ale neshledavam zadnou chybu… coz ale… :)

Caine
Člen | 216
+
0
-

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)
hrach
Člen | 1844
+
0
-

No prave tam mi to prijde aspon dobre, narozdil od webu. Fakticky tam chybi vysvetleni, ale vim, proc jsem to pojmenoval key… pac to neni targetTable…

Caine
Člen | 216
+
0
-

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

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

Abyste nerejpali, radej sem dnes napsal stranku do dokumentace :) Zatim v devu. https://doc.nette.org/en/database

Caine
Člen | 216
+
0
-

Super, akorát by bylo fajn zmínit, že takhle se to bude chovat jen pro DiscoveredReflection. Pro Conventional se to takhle chovat nebude:)

PS: máš tam několikrát „does not exists

Stic
Člen | 28
+
0
-

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 :)