2017-09-13 1 views
0

Ich versuche, ein Online-Forum mit mehreren Forum-Kategorien zu erstellen. Ich habe eine Übersicht mit allen Kategorien gemacht und unter dem Namen jeder Kategorie, ich will auf den neuesten Eintrag in der genannten Kategorie verknüpfen, etwa so:Wie Verwenden von Twig-Schleife Wert in einer SQL-Abfrage

MY FORUM

coole Kategorie
Letzter Beitrag: Test-Thread von John Doe

Interessante Kategorie
Letzter Eintrag: Ein weiterer Test Thread von Jane Doe

Lustige Kategorie
Letzter Eintrag: Witze Thread von John Doe


Also, ich habe eine SQL-Abfrage gemacht, alle Forum Kategorien zu holen:

$forumCategories = DB::run('SELECT * FROM forumCategories ORDER BY id ASC')->fetchAll(); 


und verwandelte sie in eine globale Variable:

$twig->addGlobal('forumCategories', $forumCategories); 

012 Undmachte eine for-Schleife alle Kategorien zur Liste:

{% for category in forumCategories %} 
    <h3>{{category.title}}</h3> 
{% endfor %} 


So weit, so gut.

Aber jetzt möchte ich die neuesten Beiträge in jeder Kategorie anzeigen. Ich möchte eine SQL-Abfrage ausführen und den neuesten Beitrag aus der Tabelle forumPosts für jede Forumkategorie abrufen und in der Schleife anzeigen. Ich muss eine Zeile aus forumPosts anzeigen, in der category der Kategorie category.id in der Schleife entspricht. Wie mache ich das?


Datenbank-Struktur und Inhalt:

CREATE TABLE `forumCategories` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `title` varchar(255) NOT NULL, 
    `urlTitle` varchar(255) NOT NULL, 
    `description` text NOT NULL, 
    PRIMARY KEY (`id`) 
) ENGINE=MyISAM DEFAULT CHARSET=latin1; 

INSERT INTO `forumCategories` (`id`, `title`, `urlTitle`, `description`) 
VALUES 
    (1,'Hovedrommet','hovedrommet','Dette er hovedrommet på Nye Dofo.'), 
    (2,'Forumleker','forumleker','Her kan man leke ulike forumleker.'); 

CREATE TABLE `forumPosts` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `title` varchar(255) NOT NULL, 
    `urlTitle` varchar(255) NOT NULL, 
    `category` int(11) NOT NULL, 
    `content` text NOT NULL, 
    PRIMARY KEY (`id`) 
) ENGINE=MyISAM DEFAULT CHARSET=latin1; 

INSERT INTO `forumPosts` (`id`, `title`, `urlTitle`, `category`, `content`) 
VALUES 
    (1,'Test','test',1,'Dette er test1.'), 
    (2,'Test2','test2',1,'Dette er test2.'), 
    (3,'Test3','test3',2,'Dette er test3.'), 
    (4,'Test4','test4',2,'Dette er test4.'); 

Der Ausgang ich will, ist eine Schleife mit „Titeln“ alle Kategorien, und „Titel“ des Letzten Beitrags (der mit höchster ID) in jede Kategorie. Ich bekomme den Namen der Kategorie, aber nicht den neuesten Beitrag.

Ich möchte die folgende Ausgabe:

Hovedrommet
Letzter Eintrag: Test2

Forumleker
Letzter Eintrag: Test4

+0

Es würde helfen Tabellenstruktur, einige Beispieldaten und die Ausgabe, die Sie erwarten zu sehen. –

+0

@TimBiegeleisen Ich habe jetzt die ursprüngliche Frage aktualisiert – Galaniitoluodda

+0

Welche Spalte kann verwendet werden, um den neuesten Beitrag zu finden? –

Antwort

0

Ich denke, Ihr Problem ist ein ziemlich Routineabfrage. Verbinden Sie einfach die beiden Tabellen und auch zu einer Unterabfrage, die den neuesten Beitrag für jede Kategorie findet.

SELECT 
    fc.title, 
    fp1.title 
FROM forumPosts fp1 
INNER JOIN 
(
    SELECT category, MAX(id) AS max_id 
    FROM forumPosts 
    GROUP BY category 
) fp2 
    ON fp1.category = fp2.category AND 
     fp1.id = fp2.max_id 
INNER JOIN forumCategories fc 
    ON fp1.category = fc.id 

Ausgang:

 title title 
1 Hovedrommet Test2 
2 Forumleker Test4 

Demo hier:

Rextester

+0

Ein großes Dankeschön für eine schöne Lösung! :) – Galaniitoluodda

0

Es ist im Allgemeinen nicht best practice Abfragen in Ihrer Vorlage als die einschließen Ziel sollte sein, das Modell zu trennen und so viel wie möglich zu sehen.

Ich würde den Controller verwenden, um die Daten für die Ansicht zu sammeln und in einer Weise zu organisieren, dass die Ansicht dann verdauen und direkt an die Ansicht übergeben kann, ohne das globale zu verwenden.

EDITED FÜR DIE ZUKUNFT AUF

Zum Beispiel könnten Sie die Abfrage von Tim Biegeleisen oder ähnliches vorgesehen verwenden, um die Daten zu sammeln:

SELECT p.id, p.title, p.urlTitle, c.title 
FROM (select * from forumPosts order by category, id DESC) p 
JOIN forumCategories c ON c.id = p.category 
GROUP BY p.category 

http://sqlfiddle.com/#!9/e0d35/28

und das Ergebnis in die Variable :

$forumCategories = DB::run($query)->fetchAll(); 

Dann yo u kann die ganze Sache auf die Vorlage mit so etwas wie dies passieren:

$this->render('template.twig', array('forumCategories' => $categories)); 

Dann ist es für den Zugriff auf in der Vorlage, Sie so etwas wie das folgende tun könnte:

{% for category in forumCategories %} 
    <h3>{{category.categoryTitle}}</h3> 
    <h4><a href="path/to/article/{{ category.urlTitle }}">{{ category.title }}</a></h4> 
{% endfor %} 
+0

Danke! Ich bevorzuge Ihre Lösung gegenüber der zweiten, da Ihre Anfrage kürzer und weniger kompliziert ist - es gibt nur ein Problem, es zeigt den ältesten Beitrag anstelle des neuesten. Es muss das mit dem höchsten ID-Wert angezeigt werden. Obwohl es Ihnen gelungen ist, die korrekten IDs in der Spalte "ID" auszugeben, handelt es sich bei den Post-Informationen um die Posts mit den niedrigsten ID-Werten. Was würde das reparieren? – Galaniitoluodda

+0

@Tim, ja, Sie sind definitiv richtig, ich war ein wenig Kavalier mit meiner Abfrage und es war falsch. Mein Hauptpunkt war, dass die Arbeit im Controller und nicht in der Ansicht erledigt werden sollte. Ihre Antwort ist definitiv die richtige, wenn das OP nur die richtige Methode zum Ziehen der Daten benötigte. –

Verwandte Themen