ORM

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

  • Hi,

    naja wie man speziell Kohana nutzt kannst du ja ganz gut in der Doku nachlesen, das scheint ja gut zu dokumentiert zu sein.

    Ausgangsproblem ist das OOP und relationale Datenbanken nicht zusammenpassen. Ein ORM versucht eine OOP Schnittstelle zur DB herzustellen indem einfach jede Tabelle (mit Datentype, Beziehungen etc.) einer Datenbank als Klasse (Model) abgebildet wird. Das generieren geht in den meisten ORM automatisch.


    Vorteil des ganzen ist einfach das man den OOP Ansatz konsequent verfolgen kann. Zudem ist die Handhabung sehr einfach da ein ORM einem sehr viel abnimmt und man bei richtigem Einsatz sehr viel Zeit sparen kann.
    Nachteil ist die Performance, aber ich hab auch grosse Projekte mit einem ORM realisiert und wenn die Hardware ausreicht, dann ist auch das kein Problem.


    Ich kann nur ein Beispiel in Doctrine schreiben:

    Datenbanktabelle: user und bookings

    Quellcode

    1. $data = Doctrine_Query::create()->from('User u')->leftJoin('u.Bookings b')->where('b.user_id = ?',$uID)->fetchOne();
    2. $data->Bookings->hotel = "easyCoding Resort";
    3. $data->street = "omfg";
    4. $data->save();



    Man muss sich vorher überlegen ob die Abstraktion sinn macht. Ich persönlich setze auch bei kleineren Projekten auf ein ORM, vorallem aus Bequemlichkeit und der OOP, wobei meiner Meinung nach der Nutzen nicht 100% rauskommt. Erst bei komplexeren Projekten wenn man Konzepte wie Validation, Listeners, Transactions etc. nutzt kann man mit einem ORM wirklich auftrumpfen.
  • Was mich irgendwie daran stört ist das man die Abfragen eben eigentlich in den Controllern macht.
    In MVC ist es ja so, (bzw ich habs immer so gemacht) dass man für alles eine Methode hat. $user->has_right();, $user->create(); etc.
    In ORM würde es ja eigentlich keine solchen Methoden mehr geben, da wäre es im Controller irgendwie $user->where(……)->find()->loaded() etc.
    Ist sehr schwer zu beschreiben was ich meine… Irgendwie widerspricht mir das ganze, da ich dann aus Perfektionismus für alles eine Methode machen würde oder für garnichts, was das Abfragen von Rechten z.B. komplizierter macht.
  • Ich glaube du verstehst das falsch. ORM ersetzt nicht das M(odel) in MVC, sondern es ergänzt es nur bzw. bildet eine zusätzliche Schicht zwischen Model und DBMS. So würde die Methode $user->has_right() weiterhin im Model stehen. Jedoch würde im Methodenkörper auf die ORM-Klassen zugegriffen.
    Open Source --> Programmieren aus Leidenschaft :!:

    Ich stehe weder für privaten Support per PM noch über einen IM zur Verfügung. Danke.
  • Deadman44 schrieb:

    Ich glaube du verstehst das falsch. ORM ersetzt nicht das M(odel) in MVC, sondern es ergänzt es nur bzw. bildet eine zusätzliche Schicht zwischen Model und DBMS. So würde die Methode $user->has_right() weiterhin im Model stehen. Jedoch würde im Methodenkörper auf die ORM-Klassen zugegriffen.


    Genau das wollte ich irgendwie hören. Im Kohana-Tutorial zu ORM (github.com/kohana/userguide/bl…er/guide/tutorials.orm.md) sieht alles danach aus als würde man es im Controller nutzen.

    Danke!
  • Ich widerspreche Deadman und sage das das ORM das Model schon ersetzt. Aber so ersetzt, dass man nicht seine eigenen Modelklassen einbindet sondern die vom ORM erweitert.

    Die Methode $user->has_right() würde auch weiterhin im Model stehen, du musst diese dann aber dem richtigen Model zuordnen. Wenn du eine Tabelle User besitzt erstellt das ORM ja eine Klasse (Model) User bzw. Model_User welche du ohne Probleme mit deinen Methoden befüllen kannst.


    Im Controller greifst du dann auf die Models vom ORM zu, welche du wie geschrieben nach belieben erweitern kannst.

    Quellcode

    1. $user = new Model_User();
    2. if($user->has_right()) {....


    Quellcode

    1. $user = ORM::factory('user', 5);
    2. if($user->has_right()) { ...



    Natürlich will ich nicht sagen das das einzige und richtige Weg ist. Deadmans Vorschlag wäre eine weitere Abstraktionsbarriere einzubinden und mittels "Models2" auf die Models vom ORM zuzugreifen so das man das nochmals kapselt, was man auch machen kann. Aber die ORM sind ja extra so aufgebaut das man ohne Probleme die Models weiter nutzen kann und da wäre es ja unklug wenn man nicht das nutzt was man bekommt, sondern alles neu tippt und aufbaut.