Funkce v sablone pro výpis z databáze podle id

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

Ahoj,
mám udělaný výpis článku z databáze a jako autora clanku vypisuji ID autora. Potřeboval bych udelat nejakou funkci, která by vzala proměnnou ID ze sablony a vypsala jméno. V nette začínám a nenapadá mě jak to zapsat. Díky za nápady ;)

wopice
Člen | 21
+
0
-

Myslím, že nejlepší bude se podívat na příklad z nové dokumentace. Pomocí Nette\Database to jde velmi snadno a rychle.

Martin7
Člen | 23
+
0
-

V sablone se mi vypisuje id uzivatele:

{foreach $news as $post}
            <div class="post">
                <h3>{$post['nazev']}</h3>
                <small>Přidal {$post['autor']}</small> // vypisuje id uživatele
                <p>{$post['obsah']}</p>
                <p><a href="{link single $post->id}">více..</a></p>
            </div>
            {/foreach}

a ja bych potřeboval nejak propojit promnennou $post[‚autor‘]

s touto funkcí:

public static function zjisti_jmeno($id) {

    dibi::fetch('
        SELECT [username]
        FROM [user]
        WHERE [id] = %i', $id
    );

Editoval Martin7 (25. 7. 2011 19:18)

uestla
Backer | 796
+
0
-

Doporučuji si přečíst vlákno ještě jednou od prvního do druhého příspěvku… Nejlépe dvakrát.

joe
Člen | 313
+
0
-

@Martin7:

Asi začínáš i s SQL, protože na tohle by ses neptal. Správně vytvořený dotaz by měl vypadat nějak takhle

SELECT c.*, a.* FROM clanky c JOIN autor a ON a.id = c.autor_id

Na ten nápad co jsi napsal ve 3. příspěvku zapomeň :-) Osobně upřednostňuju jednoduché použití dibi s vlastně napsaným dotazem.

Martin7
Člen | 23
+
0
-

@joe:
díky to mi pomohlo :)

ted se pokouším ke článkům vypsat počet komentářů.

v modelu mam:

public static function Select_count_comments()
{
        return dibi::query('
            SELECT COUNT(comments.news_id) AS komentu
                FROM [news]
                JOIN [comments]
                ON comments.news_id = news.id
                ');
}

a v sablone:

{foreach $news as $post}
{foreach $pocet_komentu as $pocet}
<div class="post">
    <h3>{$post['nazev']}</h3>
    <small>Přidal {$post['username']} Počet komentářů: {$pocet['komentu']}</small>
    <p>{$post['obsah']}</p>
    <p><a href="{link single $post->id}">více..</a></p>
</div>
{/foreach}
{/foreach}

takhle se mi pouze vypíše počet komentářů celkově ve všech článcích. Když přidám do modelu GROUP BY comments.news_id tak se mi začne každý článek vypisovat víckát než kolikrát je uložen v databázi. Kde dělám chybu ?

Claudie1
Člen | 21
+
0
-

ahoj,
zkus ještě GROUP BY news.id


edit: když se na to dívám znovu, tak to asi taky nepomůže. přiznám se, že úplně nerozumím tomu, proč jsou tam dva cykly v sobě, jak to má fungovat – přijde mi, že každou novinku to vypisuje tolikrát, kolik je různých součtů komentářů, ale to jistě není to, co to má dělat…

Editoval Claudie1 (26. 7. 2011 15:00)

joe
Člen | 313
+
0
-

Takhle nějak by to mělo jít

SELECT c.*, a.*, COUNT(k.clanek_id) AS pocet_komentaru FROM clanky c JOIN autor a ON a.id = c.autor_id JOIN komentare k ON k.clanek_id = c.id GROUP BY c.id

Editoval joe (26. 7. 2011 18:36)

Martin7
Člen | 23
+
0
-

díky teď to šlape akorat se nezobrazuje článek, kde nejsou žádné komentáře zkoušel jsem přidat WHERE comments.news_id = news.id OR comments.news_id != news.id ale to nefunguje stále se vypíšou pouze članky z komentářem.

joe
Člen | 313
+
0
-

Zkus místo JOIN komentare napsat LEFT JOIN komentare

Martin7
Člen | 23
+
0
-

díky moc, mám se ještě co učit :)