Výběr sloupců ze spojujících tabulek
- chr1s
- Člen | 15
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.
- chr1s
- Člen | 15
Š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
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
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)
- chr1s
- Člen | 15
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?
- vrana
- Člen | 131
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
.