Ako napísať a prejsť tabuľky 1:N pomocou left join

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

Tak som tu zas ak dovolíte.
Snažím sa spojiť dve tabuľky vo vzťahu 1:N
Proste všetkých userov(tab.users) a všetky články(tab.posts), ktoré napísali
Išiel som na to takto:

$this->template->users = $this->database->table('users')
					->select('users.*, :posts.title as title')
					->order('username ASC');

to mi vytvorí dotaz

SELECT `users`.*, `posts`.`title` `as` `title`
FROM `users`
LEFT JOIN `posts` ON `users`.`id` = `posts`.`users_id`
ORDER BY `username` ASC

To by aj šlo, ale zobrazí sa mi ladenka a že: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'title FROM users LEFT JOIN posts ON users.id =…
Problém je podľa všetkého v tom as. Ale preto sa pýtam.

No a mohol by mi niekto predviesť ako také dáta 1:N vypíšem v latte?
Ďakujem za odpoveď.

Editoval Čamo (9. 6. 2014 22:32)

David Matějka
Moderator | 6445
+
+1
-

vsechna klicova slova (AS, DESC, ASC…) musis psat velkyma pismenkama. Vsechno ostatni je brano jako nazev sloupce/tabulky a patricne se to oescapuje

Čamo
Člen | 798
+
0
-

matej21:
Díky, funguje.

a ako prejdem tie záznamy?
Mám to takto:

<div n:foreach="$users as $user">
		<h2><a n:href="Autor:show">{$user->username}</a></h2>
		<span>{$user->title}</span> |
</div>

To je len surový výpis, ale robí mi to problém. Ako keby mi to robilo niekde za chrbtom group by.
Ten príkaz by mal vypísať
Napr:

Jožko
Článok 1
Jožko
Článok 2
Fero
Ferov článok 1
Fero
Ferov článok 2
Fero
Ferov článok 3

Ale vypíše to

Jožko
Článok 2
Fero
Ferov článok 3
...

Nechápem čo robím zle.

Editoval Čamo (9. 6. 2014 22:18)

David Matějka
Moderator | 6445
+
0
-

Pokud chces vypsat seznam uzivatelu a u kazdeho uzivatele seznam jeho clanku, bude lepsi na to jit v nette/database stylu, v presenteru jen:

$this->template->users = $this->database->table('users')
                    ->order('username ASC');

a v template:

<div n:foreach="$users as $user">
        <h2><a n:href="Autor:show">{$user->username}</a></h2>
	<ul>
	<li n:foreach="$user->related('posts') as $post">
		{$post->title}
	</li>
	</ul>
</div>
Čamo
Člen | 798
+
0
-

To by som už zvládol,ale ja chcem použiť práve ten join.

David Matějka
Moderator | 6445
+
0
-

proc? s tim akorat budes mit podobny problemy. Pokud na tom ale fakt trvas, melo by stacit obratit „koren“ – tedy k posts joinovat usera

Čamo
Člen | 798
+
0
-

Proste som tak naučený – jeden select < dva selecty. Nemôžem sa toho len tak zbaviť. Na to by museli existovať nejaké pádne argumenty.

David Matějka
Moderator | 6445
+
0
-

Nekdy dva jednoduche dotazy < jeden slozity dotaz.

Ale hlavnim argumentem proc to pouzivat je, ze je na tomto konceptu NDBT postaveny a predpoklada, ze se to tak bude pouzivat. A snaha joinovat pro select muze zpusobit problemy.

Čamo
Člen | 798
+
0
-

A Dibi pracuje na akom princípe?