Jak spravne pojmenovat tabulky pro Nette\Database s vice FK na stejne PK

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

Zdravim, nedavno jsem zacal pouzivat Nette\DB a vsechno super, ale ted jsem narazil na jeden problem. Jak spravne nazvat vice FK v jedne tabulce (treba sest), ktere se odkazuji na jeden (stejny) PK v jine tabulce. A jak pak budu prochazet touto strukturou?

h4kuna
Backer | 740
+
0
-

Taky jsem si toho všiml, nevím jak to řešit. Uvedu příklad zda se bavíme o tom samém?

Příklad tabulky:

vacation

users_id
superior_id

oba sloupce ukazují na tabulku users

saimons
Člen | 293
+
0
-

Jo presne tohle myslim.

David Růžička
Člen | 43
+
0
-

Teď jsem to zrovna řešil. Pojmenovaný to máš dobře. Pro přístup k položkám přes klíč, jehož název neodpovídá názvu cílové tabulky, musíš použít druhý parametr metody ref() nebo related(). Například když chceš přes superior_id z tabulky posts získat záznam z tabulky users:

foreach ($database->table('posts') as $post)
{
	echo $post->users->name;

	echo $post->ref('users', 'superior_id')->name;
}

Bohužel s tím ref() mám teď trochu problémy a funguje mi to jen když vymažu cache.

paranoiq
Člen | 392
+
0
-

a jak se řeší případ, kdy cizím klíčem odkazuji na tutéž tabulku? (typicky parent_id)

hrach
Člen | 1838
+
0
-

Že si napíšeš vlastní vlastní reflection (z hlavy, netestovano)

class MyReflection extends Nette\Database\Reflection\DiscoveredReflection
{

	public function getBelongsToReference($table, $key)
	{
		if ($key === 'parent') {
			return array($table, 'parent_id');
		}

		return parent::getBelongsToReference($table, $key);
	}

}

edit: upraveno, ale stale netestovano ;)

Editoval hrach (11. 1. 2012 12:41)

ViPEr*CZ*
Člen | 817
+
0
-

Já zase třeba zkoušel toto:

$respons->ref('user', 'userID')->ref('contact', 'contactID')

První ref proběhne OK, protože $response ví o sloupci userID a jeho hodnotách co jsem tak zjistil. Ale ten druhej ref už neprojde. Ten vrátí NULL, protože jestli tomu dobře rozumím, tak funkce protected getReference nejspíš nenajde správnou hodnotu pro value nad sloupcem contactID.

ViPEr*CZ*
Člen | 817
+
0
-

PS: Místo getBelongsTo předpokládám má být getBelongsToReference… nic méně jsem si zkusil změnit klíč, ale nějak to se mnou furt nemluví…