Jak z jednoho modelu přistoupit k více tabulkám

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

Zdravím, při vypisování informací do stránky blogu, jsem narazil na problém.
Mám dvě tabulky, users a blog. V users mám uložené uživatele s jejich jmény (full_name) a k nim přiřazené ID. V blog mám ID článku, jeho titulek, obsah a ID autora. V .latte souboru potřebuji vypsat údaje o článku z tabulky blog a podle ID autora v ní uložené, vybrat z tabulky users podle ID dotyčného uživatele.
Nevím si s tím rady, děkuji za odpovědi.

elden46
Člen | 37
+
0
-

Ahoj,
pokud mas spravne pojmenovane tabulky, tak se o to postara Nette/Database samo.

Tabulka blog:

id title content user_id

Tabulka user:

id full_name

V presenteru:

<?php
$this->template->blogPosts = $this->context->createBlog()->getBlog();
?>

V templatu:

{foreach $blogPosts as $blogPost}
	{$blogPost->title} od autora {$blogPost->user->full_name}
{/foreach}

Snad jsem nic nespletl, pisu to nasucho.

Grelek
Člen | 233
+
0
-

Nějak mi to nefunguje.. přikládám zdrojové kódy na ukázku, jsem opravdu ten největší začátečník jak jen to jde.
blog:

id title content posted (timestamp) author_id

users:

id username password full_name position about email telephone role

Blog.php:

<?php
use Nette\Database\Connection,
	Nette\Database\Table\Selection;

class Blog extends Selection {

	public function __construct(Connection $connection) {

		parent::__construct('blog', $connection);

	}

}
?>

BlogPresenter.php:

<?php
class BlogPresenter extends BasePresenter {

	private $blog;

	public function actionDefault() {

		$this->template->blog = $this->context->createBlog();

	}

}
?>

default.latte:

{var $title = 'Blog'}
{block content}
<div id="body">
	<div class="square" style="height: auto;">
		<h1 class="motto">Vítejte v našem blogu.</h1>
		<h2 class="motto">Zde se dozvíte novinky a různé akce firmy.</h2>
	</div>

	<div id="content">
		{foreach $blog as $radek}
		<table>
			<thead>
				<tr>
					<th>{$radek->title}</th>
				</tr>
			</thead>
			<tbody>
				<tr>
					<td>{$radek->posted}</td><td><a n:href="Blog:show $radek->id">Otevřít článek</a></td>
				</tr>
			</tbody>
		</table>
		{/foreach}
	</div>
{/block}

a show.latte:

{foreach $blog as $radek}
{var $title = $radek->title}
{block content}
<div id="body">
	<div class="square">
		<h1 class="motto">{$radek->title}</h1>
		<h2 class="motto">{$radek->author_id}</h2>
		<p>{$radek->content}</p>
	</div>
</div>
{/block}
{/foreach}

Omlouvám se za mnoho kódu, bohužel opravdu potřebuji tento problém co nejrychleji vyřešit a tak sem vkládám všechno najednou, aby jste mi mohli případně poradit.

JuniorJR
Člen | 181
+
0
-

Přejmenuj si author_id na user_id a tabulku users přejmenuj na user. Pak by mělo fungovat automatické namapování pomocí cizích klíčů a vypsání jména autora např. tímto způsobem

{$radek->user->full_name}

Editoval JuniorJR (16. 5. 2012 19:18)

elden46
Člen | 37
+
0
-

Pokud bys nechtel prejmenovavat tabulky, aby se chytla automaticka reflexe, tak by ses mel k vysledku dostat pomoci

	$blog->ref('users','author_id')->full_name
Grelek
Člen | 233
+
0
-

elden46 napsal(a):

Pokud bys nechtel prejmenovavat tabulky, aby se chytla automaticka reflexe, tak by ses mel k vysledku dostat pomoci

	$blog->ref('users','author_id')->full_name

Háže mi to tuhle chybu:
Nette\MemberAccessException
Call to undefined method Blog::ref().

I když jsem uvedl use Nette\Http nebo use Nette\Http\Request. Zkoušel jsem i metody getQuery(), getParameters() a buď na mě řve, že tu metodu nezná, nebo že přistupuji k něčemu, co není objekt, když jsem použil $this.

elden46
Člen | 37
+
0
-

Spatne jsem se vyjadril, tu ref() musis v templatu navazat na $radek

Grelek
Člen | 233
+
0
-

Takže jestli to má být: $radek->ref('users','author_id')->full_name, tak to háže chybu:
Notice
Trying to get property of non-object

Navíc když potřebuji zjistit parametr z URL, která je http://localhost/projekt/www/blog/show/<ID>, nevím si taktéž rady. Teď jsem hodinu a půl hledal a nenašel jsem nic, co by jen trochu korespondovalo s mými problémy.

elden46
Člen | 37
+
0
-

tak jsem si nahral sandbox a zkusil jsem asi to a opravdu to nebezi, nechapu:-(

Grelek
Člen | 233
+
0
-

elden46 napsal(a):

tak jsem si nahral sandbox a zkusil jsem asi to a opravdu to nebezi, nechapu:-(

Vyřešil jsem můj neřešitelný problém. To tvé funguje, měl jsem problém se získáním dat :).