Jak z jednoho modelu přistoupit k více tabulkám
- Grelek
- Člen | 233
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
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
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 | 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.
- Grelek
- Člen | 233
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
.
- Grelek
- Člen | 233
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.