Chyba v dokumentácii NDBT?

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

Vitajte,
Ide o tent príklad s prepojením tabuliek v db
Jedná sa o metódu ref(table, field). Je tam napísané, že zápis
book->autor->name == book->ref(autor)->name.

Metoda ref() príma ako parametre tabulku a stĺpec.
No a problematický zápis ktorý tam je
book->translator->name == book->ref(translator)->name
Podľa toho tam chýba tabuľka translator.
Dlho som si myslel, že je tam omylom miesto stĺpca translator_id stlpec maintainer_id a smeruje do tabuľky autor.
Lenže ten zápis book->translator->name mi vychádza, že sa spája s babuľkou translator ktorá tam nieje a začiatočníkou to mätie.
Zjavne tam chýba tabuľka translator, Alebo ak translator patrí do tabuľky autor, tak by mal dotaz vyzerať podľa mňa
Book->ref(autor,translator)->name
Ako to teda je???
Ďakujem

Editoval Čamo (4. 8. 2014 11:22)

CZechBoY
Člen | 3608
+
0
-

Hoj,
podle mě chybí v tabulce translator_idauthor table

vvoody
Člen | 910
+
0
-

Chyba je v tom obrázku, maintainer_id by mal byť translator_id, kedže na ďalšej strane sa spomína len translator. Translátor nieje ďalšia tabuľka, pointa bola ukázať že sa dá pracovať s dvomi FK (author_id, translator_id) smerujúcimi na tú istú tabuľku (author).

Čamo
Člen | 798
+
0
-

Ale ak translator_id = maintainer_id tak ako bude Nette podla zápisu Book->tanslator->name vedieť, s ktorou tabuľkou sa má spojiť?
Book->autor->name sa ešte dá odvodiť, že sa spojí s table autor, ale z čoho sa odvodí, že book->translator->name smeruje tiež na autor?
Pre toto sa na to pýtam.

Editoval Čamo (4. 8. 2014 11:34)

Mysteria
Člen | 797
+
0
-

Cizí klíč?

David Matějka
Moderator | 6445
+
0
-

https://doc.nette.org/…ase/explorer#…

Logika vytváření „spojovacího klíče“ je dána implementací IReflection. Doporučujeme použití DiscoveredReflection, které analyzuje cizí klíče a umožňuje jednoduše pracovat se vztahy mezi tabulkami.

Editoval matej21 (4. 8. 2014 12:05)

Čamo
Člen | 798
+
0
-

Mysteria, matej
Ako sa analyzujú tie cudzie kľúče? Podľa názvu stĺpca, alebo sa kladie databáze nejaký dotaz?
Dúfam, že mi nepoviete, že si mám preštudovať ten kód.

Editoval Čamo (4. 8. 2014 12:35)

David Matějka
Moderator | 6445
+
+1
-

z information schema si nacte cizi klice (viz kod) a to pote cachuje

Čamo
Člen | 798
+
0
-

Takže dotaz na information schema a nie podľa názvu?
Mám k tomu ešte dve otázky.
1.Ako sa prepįna medzi tým IReflection a DiscoveredReflection?

2.Nieje ten dotaz

$query = 'SELECT CONSTRAINT_NAME, COLUMN_NAME, REFERENCED_TABLE_NAME, REFERENCED_COLUMN_NAME FROM information_schema.KEY_COLUMN_USAGE '
           . 'WHERE TABLE_SCHEMA = DATABASE() AND REFERENCED_TABLE_NAME IS NOT NULL AND TABLE_NAME = ' . $this->connection->quote($table);

Platný iba pre mysql?

Editoval Čamo (4. 8. 2014 12:55)

David Matějka
Moderator | 6445
+
+1
-
  1. z information schema se vytahnou cizi klice, v tom se pote hleda treba to, kam smeruje sloupecek translator_id
  2. IReflection je interface, DiscoveredReflection je konkretni implementace, pak je tu jeste ConventionalReflection. https://doc.nette.org/cs/configuring#…
  3. ano, ten dotaz je platny pouze pro mysql. A proto je ve tride MysqlDriver

Editoval matej21 (4. 8. 2014 12:59)

Čamo
Člen | 798
+
0
-

A keď sa napíše
book->ref(‚autor‘, ‚translator_id‘)->name
tak sa tiež spustí ten proces zisťovania, alebo sa to zrýchli? Alebo je to jedno?

PS: A nemohol by niekto ten obrázok vymeniť?
https://docs.google.com/…M2M2Ymc/edit?…

David Matějka
Moderator | 6445
+
+1
-

pri uvedeni book->ref('autor', 'translator_id')->name to nebude ty informace zjistovat v te reflection, takze se to teoreticky zrychli. ale vzhledem k tomu, ze ty informace o FK nette\database cachuje, tak ten rozdil bude minimalni..

Čamo
Člen | 798
+
0
-

Ok díky moc. To by malo byť všetko.