Ankündigung

Einklappen
Keine Ankündigung bisher.

MVC, Datenbankabfragen und Performance

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • MVC, Datenbankabfragen und Performance

    Hallo zusammen,

    mal angenommen wir haben folgendes System (beispielhaft):

    - User (Lehrer, Schüler)
    - Klassen
    - Fächer

    Nun soll auf einer Seite jede Klasse samt der Schüler, Unterrichtsfächer und dem Lehrer ausgegeben werden. Es handelt sich um ein MVC System und wir wollen natürlich die Modelfunktionen nutzen.

    Beispiel:
    - Models: Class, ...
    - Functions: create(), delete(), update() get_list()...

    Wie würdet ihr in einem solchen Fall vorgehen?

    Gedanken:
    Wenn ich die einzelnen Modelmethoden nutze, würde ich viel zu viele MySQL Abfragen starten und müsste zusätzlich im Controller die Daten in einer Form bringen, sodass ich in der View damit gescheit arbeiten kann. Mit einer oder wenigen gezielten SQL Abfrage und passenden JOINs kann ich die Ausgabe bestmöglich passend erhalten.

    Die Fragen die sich mir bei der Arbeit nach MVC Konzept stellen liegen halt öfters im Bereich:

    - Wie schaffe ich es Modelmethoden möglichst allgemeingültig zu halten aber gleichzeitig nicht zu viele Daten, zu viele Abfragen zu starten?
    - Wann erstelle ich einen eigenen Controller (in diesem Fall einen für die Klassenliste)?
    - ...

    Weiteres Beispiel:
    Oftmals ist es ja nunmal so, dass man in bestimmten Tabellen via Ids Verknüpfungen zu anderen Tabellen hat. Man kann auch in einer Rechnungsansicht nicht einfach IDs ausgeben, sondern es sollen natürlich die Benutzerinformationen (Name, ...) angezeigt werden.

    Vielen Dank!!


  • #2
    Hallo,

    also zunächst mal: Class ist ein "reserved word" in PHP, deshalb immer schön mit Namespace oder Prä- oder Postfix arbeiten -> ClassModel.
    Deine Funktionen sind schön und gut, CRUD nennt sich das, aber dabei muss es ja nicht bleiben!Du kannst deiner ClassModel-Klasse ruhig Methoden verpassen, die genau auf deine Wünsche zugeschnitten sind.

    PHP-Code:
    <?php
    $classId 
    = (int)$_GET["id"];
    // Klasse holen
    $class $classModel->getClass($classId); // SELECT * FROM class WHERE id = X

    // Unterrichtsfächer holen
    $subjects $subjectModel->getClassSubjects($class); // SELECT * FROM subject WHERE class_id = X

    // Lehrer:
    $teachers $teacherModel->getClassTeachers($class); // SELECT * FROM class_has_teacher INNER JOIN teacher ON .. WHERE class_id = X
    ?>
    Ich benutz dabei meistens die Syntax: aktion: (get), betreffs wen: (Class), was: (Subjects). So kann man (hoffentlich sehen und auch im Lesefluß erkennen) was man zurückbekommt und was man primär der Methode zur Verfügung stellen soll.

    Wenn du jetzt für die Unterrichtsfächer den jeweiligen Lehrer willst, brauchst du zwei SELECTs:
    PHP-Code:
    <?php
    class SubjectModel {
      public function 
    getClassSubjects(ClassObject $class) {
        
    // alle Fächer für die Klasse holen
        // alle Lehrer dieser Fächer holen
        // Zuordnung fach->setLehrer
      
    }
    }

    // ..

    $subjects $subjectModel->getClassSubjects($class);
    foreach (
    $subjects as $subject) {
      
    $teacher $subject->getTeacher();
      echo 
    $teacher->getName() . " unterrichtet die Klasse in " $subject->getTitle();
      echo 
    "<hr />";
    }
    ?>
    Wenn du die Modelle untereinander vernetzt/zugänglich machst, kann getClassSubjects() nun auf $teacherModel zugreifen und die Lehrer abgreifen, ohne dass du von außen etwas davon mitbekommst.
    "Mein Name ist Lohse, ich kaufe hier ein."

    Kommentar


    • #3
      Hi,

      danke für deine umfangreiche Erklärung.

      Eine Frage zu den erweiterten Methoden. Woran entscheidest du ob du sagst:

      Code:
      $classModel->get_class_teachers($class)
      oder
      $teacherModel->get_teachers_by_class($class)
      Würdest du ein Model / Benutzerrolle erstellen oder alles mit einem Usermodel handhaben?

      Kommentar


      • #4
        http://www.php.de/php-fortgeschritte...l-von-mvc.html
        actra.development - Zend Certified Engineer for PHP5 - actra-oss @ github

        Kommentar


        • #5
          Naja die Klasse ($class) liegt ja schon vor und ich will ihre Lehrer haben, entsprechend kommt die Methode in das Lehrer-Model. Relevant ist bei mir immer, was die Methode zurückgibt. Sprich wenn ich von einer Methode Lehrer als Rückgabewert haben möchte, dann kann das folglicherweise das Lehrer-Model am besten zur Verfügung stellen. Dadurch ergibt sich natürlich eine gewisse Bindung/Abhängigkeit unter den Models:

          teacher
          id | name

          class
          id | label

          class_has_teacher (oder teacher_has_class? )
          teacher_id | class_id

          Wenn ich jetzt für einen Lehrer alle Klassen haben möchte, kommt das ins ClassModel.
          Wenn ich für eine Klasse alle Lehrer haben möchte, kommt das bei mir ins TeacherModel.
          Zwei Models greifen also auf die selbe Verbindungstabelle zu, jeweils allerdings von einer anderen Seite.

          Wenn man da einer gewissen Linie folgt und nach Schema die Methoden ablegt, ist es für jedermann auch einfacher zu "erraten" in welchem Model er welche Methode zu erwarten hat. Da muss halt jeder seiner eigenen Logik folgen, mir gefällt meine - wer hätts gedacht - gerade ganz gut.
          "Mein Name ist Lohse, ich kaufe hier ein."

          Kommentar

          Lädt...
          X