Dashboard nach Datum sortiert

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Dashboard nach Datum sortiert

    Hey,
    ich bin aktuell am programmieren eines Dashboards für ein privates Projekt von mir.

    Nun ist es so, dass man als User mehreren "Dingen" (Objekten) folgen kann: Kommentaren, Mitgliedern, Crews, Battles und RSS-Feeds.

    Ich bekomme über einen, von Laravel "generierten", Query die zu folgenden Objekte heraus ("getFollowedBattles()", "getFollowedCrews()", ...):

    Quellcode

    1. protected function getFollowedBattles() {
    2. return RssFeed::join('follower_battle', function($join) {
    3. $join->on('follower_battle.battleID', '=', 'battles.id')
    4. ->where('follower_battle.userID', '=', $this->userID);
    5. })->get();
    6. }


    Nun zu meiner Frage:
    Die Objekte implementieren alle das Interface "Commentable" und/oder "Actionable".
    Actionable liefert die Methode "getActions()" mit, welche z.B. bei einem Userobjekt Sachen wie (zum Verständnis):
    "Vincent hat sich registriert."
    "Vincent folgt nun dem Battle #12345."
    in Form von "Action"-Objekten.

    Gleiches mit dem Interface "Commentable", welches die Methode "getComments()" mitliefert.

    Nun haben die Action- und Comment-Objekte jeweils Timestamps.
    Mein Ziel ist ein Array mit Action- und Comment-Objekten ALLER "Follow-Objekte", sortiert nach den Timestamps.

    Was also prinzipiell mein Ziel ist: ein Facebookartiges Dashboard.

    Wie würdet ihr das ganze umsetzen?
    Die Frage klingt zwar doof - aber ich möchte nicht bei jedem Seitenaufruf 5 Queries und 5 foreach-Schleifen á X Durchläufe durchführen müssen. Oder führt da kein Weg dran vorbei?

    Liebe Grüße,
    Vincent
    "Das müsste jetzt funktionieren..."

    ---
    Mit freundlichen Grüßen,
    Vincent Petritz
  • Nabend Vincent,

    wenn ich dich richtig verstehe, existiert für jede der 5 Benachrichtigungsttypen jeweils eine Tabele, die aber nicht explizit Berechtigungen sind, sondern sie daraus generierst?


    Möglichkeit 1:

    Eine Benachrichtigungstabelle anlegen, in der jede Spalte eine Benachrichtigung ist, die du dann beim Auftreten der Ereignisses erstellen musst. Also wenn ein User sich registriert, diese Meldung in die Benachrichtigungstabelle kommt.

    +----------------------------------------------------------------------+
    | notificationId | affectedUser | +++++ notification ++++++| timestamp |
    +----------------------------------------------------------------------+
    | 1 +++++++++++++| 0 +++++++++++| Neuer Nutzer "easy ;)" ++| +44984514 |
    | 2 +++++++++++++| 7 +++++++++++| Like deines Beitrags. +++| +44564775 |
    +----------------------------------------------------------------------+


    Hierbei wäre affectedUser die Id des Nutzers, dem die Benachrichtigung angezeigt werden soll. Wenn die ID gleich 0 ist, wird sie allen Usern angezeigt.

    Ich persönlich würde noch eine Spalte hinzufügen, die angibt welcher Typ von Benachrichtigung vorliegt. Damit lässt sich das abspeichern des gesamten Strings verhindern (Speicherplatz), indem man nur wichtige Variablen wie den Nutzernamen und den Typ "newRegistration" angibt. Ich hoffe das ist ohne Tabelle verständlich, wenn nicht -> sagen. ;)
    Im Query würde ich dann nach Typ und dann nach dem timestamp bzw. Id sortieren. Damit erhälst du einen Array durch ein Query, den du einmal mit einer For-Schleife durchläufst. Durch das Sortieren hast du die Benachrichtigungen Typweise vorliegen, falls notwendig.
    Den Notificationtyp aber numerisch speichern, auch in der zweiten Möglichkeit.


    Möglichkeit 2: (..., die ich persönlich unschöner finde)


    Du benutzt deine bisherige Methode, nutzt aber zwei wichtige MySQL-Funktionen:

    UNION: dev.mysql.com/doc/refman/5.6/en/union.html
    AS: dev.mysql.com/doc/refman/5.0/en/select.html (Nach "alias" suchen)

    Dann baust du dir im Prinzip folgendes Query: (Bin mir nicht zu 100% sicher, ob das mit dem notificationType funktioniert)

    SQL-Abfrage

    1. SELECT `battleId` AS `id`, 'battle' AS `notificationType`, `timestamp` FROM `battles` WHERE `target` = :userId
    2. UNION
    3. SELECT `id`, `registrationTimestamp` AS `timestamp`, `username`, 'registration' AS `notificationType` FROM `user`,
    4. .
    5. .
    6. .




    Ich hoffe es ist verständlich, was ich mit den beiden Möglichkeiten meine. ;)


    Gruß
    ActiveRecord
  • Hey Active Record,
    danke für deine ausführliche Antwort! Das Thema hatte ich zwar schon als erledigt markiert, dennoch möchte ich euch gerne an meiner Lösung teilhaben lassen. :)

    Ich habe mir einen Controller, FollowerController, erstellt, welchem ich beim Konstruktor eine userID mit übergebe. Dieser Controller beinhaltet einige Getter: getFollowedRssFeeds(), getFollowedBattles(), getFollowedCrews(), getFollowedComments(), getFollowedUsers() - das aufgrund meiner Datenbankstruktur (siehe Anhang 1). Ich bekomme per JOIN-Query Objektarrays zurück. Da ich weiß, dass alle Objekte das Commentable-Interface implementieren, durchschleife ich anschließend das Objektarray und rufe die Methode getCommentIds() des jeweiligen Objektes auf, welche mir ein eindimensionales Array mit ID's zurückgibt. Anschließend nutze ich einen WHERE IN Query, und hole mir alle Kommentare (das sind die Objekte, die im Dashboard zu sehen sein sollen), die den ID's aus dem Arrays entsprechen und sortiere sie nach dem Datum.

    Funktioniert wunderbar, und durchs Caching fühle ich mich auch nicht ganz sooo schlecht dabei, mal ein paar JOIN-Queries laufen zu lassen. :)

    Liebe Grüße,
    Vincent
    Bilder
    • brcdb1.PNG

      3,62 kB, 156×118, 154 mal angesehen
    "Das müsste jetzt funktionieren..."

    ---
    Mit freundlichen Grüßen,
    Vincent Petritz