INNER JOIN pomocí Nette\Database
- theacastus
- Člen | 81
Zdravím,
tvořím provázaný dotaz pomocí Nette\Database a co jsem tu tak četl, tak snaha nutit Nette aby tvořilo joiny je nepochopení NDB.
Takže jsem to vzal ještě jednou a napsal si jak SQL command tak se snažím rozchodit i čisté NDB.
Cílem je podle ID autora v tabulce blog_posts vytáhnout jeho jméno z tabulky account, sloupec username
SQL:
SELECT blog_posts.title,blog_posts.content,blog_posts.posted,account.username FROM blog_posts
INNER JOIN account
ON blog_posts.author=account.id
- limit a order by, ale ty teď neřeším, nejdřív by to mělo fungovat.
PHP – Nette\Database:
$posts = $this->database->table('blog_posts')
->where('account.id', 'blog_posts.author')
->order('posted DESC')
->limit(5);
$this->template->posts = $posts;
Výsledkem by mělo být, že v latte pak můžu vypsat autora u příspěvku, u stránky s příspěvkem jsem to udělal přes 2 dotazy v NDB, ale přijde mi to jako zlo, když to jde dením dotazem…
default.latte:
{block content}
<div class="container">
{foreach $posts as $post}
<div class="post">
<h1><a href="{link Blog:post $post->id}">{$post->title}</a></h1>
<p>Author: <a href="{link User:show $post->author}">{$post->author->username}</a> | Posted at {$post->posted|date:'F j, Y, g:i A'}</p>
<div>{$post->content|truncate:750}</div>
<a role="button" class="btn btn-secondary btn-sm" href="{link Blog:post $post->id}">Continue reading...</a>
</div>
<br>
<br>
{/foreach}
</div>
{/block}
Laděnka hlásí:
No reference found for $blog_posts->account.
Ještě jsem to kontroloval, adminer odkazuje že blog_posts.author ⇒ account.id existuje
Díky za jakékoliv návrhy^
~Aca
Editoval theacastus (19. 6. 2016 17:59)
- theacastus
- Člen | 81
Unlink napsal(a):
Ono môžeš použiť napr.
$posts = $this->database->table('blog_posts') ->select('blog_posts.*, author.username') ->order('posted DESC') ->limit(5); $this->template->posts = $pos
Ten where tam je zbytočný.
Jej, díky moc!
- Webster.K
- Člen | 212
Tak jsem se dostal do stejného problému jen k modelům aut potřebuji přiřadit značku. Propojení v admineru vidím, je tam modely.id_znacky → znacky.id_znacky, toto propojeni existuje, dotaz je: $this->database->table(‚modely‘)->order(‚znacky.name ASC‘)->fetchAll(); čehož výsledek je No reference found for $modely->znacky. Co s tím? spojení v databázi mezi tím existuje, resp: cizí klíč existuje :/ někdo nějaký nápad?
- Webster.K
- Člen | 212
ano, cache jsem promazal, ale pořád to hlásí stejný problém, možný bych měl zmínit, že používám nette 2.3. Mám z modelů cizí klíč z id_znacky do tabulky znacky.id_znacky, nemusí být to i opacně? Jakože v znacky.id_znacky na modely.id_znacky? protoze tabulka znacky nema cizi klic, jen modely… ale je pravda ze hledam vzdy podle modelu, nikdy podle znacky, jen podle ni ted nemuzu radit
Editoval Webster.K (5. 3. 2018 11:36)