INNER JOIN pomocí Nette\Database

theacastus
Člen | 81
+
0
-

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)

Unlink
Člen | 298
+
0
-

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ý.

theacastus
Člen | 81
+
0
-

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
+
0
-

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?

CZechBoY
Člen | 3608
+
0
-

Jestli si nově upravil strukturu tak smazat cache.

Webster.K
Člen | 212
+
0
-

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)

CZechBoY
Člen | 3608
+
0
-

Směr cizího klíče:
záleží jestli máš v znacky zmínku o modelu (fk v značkách odkazující na modely)
nebo jestli máš v modelech zmínku o značce (fk v modelech odkazující na značky)

Webster.K
Člen | 212
+
0
-

V modelech mám zmínku o znacce, resp ID_modelu, ID_znacky, jmeno_modelu, a v modelech mam i FK na znacky, ve znackach by to smysl nemelo, tam je jen id_znacky, jmeno_znacky, protoze jedna znacka ma vic modelu ale jeden model „nema“ vic znacek.