Výběr sloupců ze spojujících tabulek

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

Zdravím,
už jsem několikrát projel fórum, ale stále nemůžu přijít na jednu věc. Jedná se o to, že mám 2 (nebo více tabulek), které spojím, ovšem mám dostupné sloupce pouze z jedné tabulky a potřebuju data i z druhé tabulky. Uvedu na příkladu – mám tabulky a jejich sloupce:

users

  • userId
  • name
  • login

posts

  • postId
  • topicId
  • userId
  • text

A potřebuji vypsat všechny příspěvky daného tématu, ale zároveň abych měl dostupné i sloupce name a login z tabulky users.

U tohohle jsem skončil a nevím co mám dopsat, abych měl dostupná data z obou spojujících tabulek.

$db->table('posts')->where('userId', $db->table('users')->select('userId'))->where('topicId', $topicId);

Používám Nette 2.0-dev, PHP 5.3.
Díky moc za jakkoukoliv radu.

Šaman
Člen | 2634
+
0
-

Jinak tohle nesouvisí ani přímo s Dibi, tohle je otázka SQL, konkrétně tě zajímá JOINování tabulek.

V nejjednodušším případě SELECT * FROM [users] JOIN [posts] USING (userId)

Zjisti si ale rozdíly mezi obyčejným JOIN a LEFT JOIN, používají se každý v trochu jiné situaci.

chr1s
Člen | 15
+
0
-

Šaman napsal(a):

Jinak tohle nesouvisí ani přímo s Dibi, tohle je otázka SQL, konkrétně tě zajímá JOINování tabulek.

V nejjednodušším případě SELECT * FROM [users] JOIN [posts] USING (userId)

Zjisti si ale rozdíly mezi obyčejným JOIN a LEFT JOIN, používají se každý v trochu jiné situaci.

Jo, to vím. Taky ten dotaz tam můžu napsat rovnou, ale chtěl jsem to spíš vyřešit přes takovou tu hezkou syntax, kterou jsem uvedl výše (teda jestli to nějak jde).

dakota
Člen | 148
+
0
-

chr1s napsal(a):

A potřebuji vypsat všechny příspěvky daného tématu, ale zároveň abych měl dostupné i sloupce name a login z tabulky users.

$posts = $db->table('posts')->where('topicId', $topicId);
foreach($posts as $post) {
	echo $post->text;
	echo $post->users->name;
}

Zatiaľ nie je možné použiť vlastný DatabaseReflection. Treba zatiaľ použivať user pre tabuľku, id pre primárny kľúč a user_id pre cudzí kľúč (alebo users pre tabuľku, id pre primárny kľúč a users_id pre cudzí kľúč).

$posts = $db->table('post')->where('topic_id', $topicId);
foreach($posts as $post) {
	echo $post->text;
	echo $post->user->name;
}

Editoval dakota (17. 2. 2011 8:59)

chr1s
Člen | 15
+
0
-

dakota napsal(a):

chr1s napsal(a):

A potřebuji vypsat všechny příspěvky daného tématu, ale zároveň abych měl dostupné i sloupce name a login z tabulky users.

$posts = $db->table('posts')->where('topicId', $topicId);
foreach($posts as $post) {
	echo $post->text;
	echo $post->users->name;
}

Zatiaľ nie je možné použiť vlastný DatabaseReflection. Treba zatiaľ použivať user pre tabuľku, id pre primárny kľúč a user_id pre cudzí kľúč (alebo users pre tabuľku, id pre primárny kľúč a users_id pre cudzí kľúč).

Momentálně nemám možnost vyzkoušet, ale jseš si jístý, že když napíšu $posts = $db->table('posts')->where('topicId', $topicId); a následně budu iterovat přes foreach, že budu mít přístup k $post->users->name;? Protože v proměnné $posts budu mít podle výše uvedeného dotazu pouze sloupce z tabulky posts ne?

Editoval chr1s (17. 2. 2011 10:09)

dakota
Člen | 148
+
0
-

Ak dodržíš mennú konveciu id, table_id tak to bude fungovať. V tabuľke posts máš odkaz na tabuľku users cez users_id, pričom Nette\Database\Selector si pri $post->users->name na základe users_id získa údaje z tabuľky users.

Editoval dakota (17. 2. 2011 10:34)

chr1s
Člen | 15
+
0
-

Ahá :), to jsem netušil, že je to svázáno s takovouto konvencí. Hned jak budu moct, tak vyzkouším. Takže prozatím díky!

chr1s
Člen | 15
+
0
-

Tak to funguje! Ještě jednou díky za pomoc.

PS: Není to trochu ruce svazující konvence, když ti říká, jak máš mít pojmenované tabulky a jejich atributy v databázi? Existuje i nějaké jiné řešení, které má podobný přístup k datům nezávisle na pojmenování tabulek a jejich sloupců v DB?

mm-marek
Člen | 61
+
0
-

Aplikaci si rozdělíš do vrstev, takže formu dat máš oddělenou.

http://zdrojak.root.cz/…tektury-mvc/

vrana
Člen | 131
+
0
-

chr1s napsal(a):

PS: Není to trochu ruce svazující konvence, když ti říká, jak máš mít pojmenované tabulky a jejich atributy v databázi? Existuje i nějaké jiné řešení, které má podobný přístup k datům nezávisle na pojmenování tabulek a jejich sloupců v DB?

Ano, originální NotORM a časem i Nette\Database.