PHP-ORM (MySQL)



  • Patrick_C64 schrieb:

    ich möchte unbefangen bleiben deswegen schau ich mir Doctrine nicht genauer an. Kenne dies aber.

    Nichts gegen Doctrine oder andere, aber ich möchte soweit eigene Wege gehen und frei von äußeren Einflüssen bleiben

    Das ist die falsch Einstellung, da gibts gar nichts zu diskutieren. Die Basis jeder wissenschaftlichen Arbeit, eines Projekts oder irgendeiner ähnlich gelagerten Arbeit sollte immer der Vergleich mit bereits existierenden Lösungen bilden. Man muss bereits Vorhandenes genau untersuchen, untereinander vergleichen, dann erst die eigene Idee/Lösung vorstellen und zeigen, worin sie sich unterscheidet, oder warum sie für einen bestimmten Zweck besser ist.
    Ein ORM ist ja fast ein Paradebeispiel für sowas. Es gibt dutzende ORM Frameworks (nicht nur in PHP, du könntest auch andere Sprachen für den Vergleich hernehmen). Die unterscheiden sich auch durchaus ziemlich stark. Gerade da wäre es interessant zu zeigen, was andere können, wie man sie benutzt, und wie man das selber besser machen will.
    Ich finde sowas selbstverständlich und eines der grundlegendsten Sachverhalten, die man in der Ausbildung/Studium gelernt haben sollte.



  • Patrick_C64 schrieb:

    Nun kann man über diese Ansicht diskutieren aber das ist nicht Thema dieses Threads!



  • News !!

    Shade of mine schrieb:

    Wie sieht es zB aus wenn die Tabellen schon bestehen? Muss ich trotzdem jedesmal den Klassen-Code angeben?

    DONE ! 😉 Version 1.03b

    $MyORMC = new ORMC ("Tabellenname") <- So mehr ist für bestehende Tabellen nicht mehr nötig!

    Mechanics schrieb:

    Zum einen ist es sehr schlecht, wenn ein ORM Framework nur ein DBMS unterstützt

    Kein Thema, siehe den MySQLi DBC, ist zwar kein anderes DBMS aber ich brauch nur einen neuen DBC für das jeweilige DBMS schreiben, ist auch schon geplant, könntest das aber auch machen, anstatt hier nur zu nörgeln 😃 !

    Hmm So sonst ist erstmal nichts weiter, ich möchte mich nochmal ganz ganz Herzlich bei Shade of Mine und vor allem bei triptop Bedanken (bei triptop für seine echt positive Hartnäckigkeit, mit der er mir einen Denkfehler letzlich so dass ich Ihn auch erkennen konnte aufgezeigt hat!). Nochma dickes Danke an Euch beide!

    Würde mich wirklich freuen wenn jemand Interesse am Interface hat bzw. es dem ein oder anderem nützlich sein kann. Bugs werde ich soweit ich drauf hingewiesen werde unverzüglich Beheben.

    PHP-ORM, zum Download
    http://c64.feuerware.com/page/index.php?topics=cmd&cmd=select&id=11

    Über konstruktive Kritik, und Vorschläge würde ich mich auch sehr freuen!

    schönes Wochenende euch allen!

    mfg. Patrick


  • Mod

    Hallo.

    Wie kann ich folgendes machen:

    Ich habe eine Tabelle Bücher und eine Tabelle Autoren. Ein Autor hat N Bücher und ein Buch hat N Autoren.
    Ich würde gerne zu einem Buch alle Autoren und zu einem Autor alle Bücher listen können.

    Wie mache ich das mit phorm?

    Und wie kann ich die performance verbessern? Wenn ich ein Objekt habe, bei dem ich 10 Eigenschaften anpassen will zB ein Buch mit Titel, Subtitel, Synopsis, Kategorie, Bindung, Verlag, Sprache, Releasejahr, Wievielte Auflage,...

    Dann wird jedesmal ein TupleUpdate ausgeführt - ich würde das aber gerne in einem Rutsch machen können... Ein Query reicht ja.



  • News !

    Hallo Shade of Mine,

    zu 1. wollte ich Dir eigentlich flink Pseudocode schreiben, aber ich denke mal das läuft nicht weg deswegen schaue ich mal ob ich Montag/Dienstag ein "vernünftiges" über Pseudocode hinausgehendes Beispiel dazu erstellen kann! Gehen tut das ohne Frage, auch relativ simpel!

    Zu 2. ist schon vorgesehen (siehe ORMO __sycnmode__ / ORMC syncmode ) aber noch nicht voll implementiert war nicht vorgesehen im Abschlussprojekt, und bisher bestand für mich noch kein Bedarf, aber der Fall wurde bereits meinerseits berücksichtigt da er mir auch schon Eingefallen ist 😉 siehst du ja anhand der jeweiligen Attribute __syncmode__ in ORMO und syncmode in ORMC. Die weitere Implementierung als solches ist in 15 minuten gemacht, aber jetzt ist WE 😃

    Man kann dann für eine komplette Klasse/Tabelle und deren Objekte den Sycnmode festlegen oder direkt für ein speziefisches Object/Tupel.

    Natürlich kommt dann noch eine ORMO Methode hinzu ala Sync oder Update, und zum setzen des Syncmode der Klasse und eines Objektes. Objekte bekommen den Syncmode der Klasse, aber jedes Objekt kann einen seperaten Syncmode haben. Ob letzlich ein Object einen eigenen von der Klasse unabhängigen Syncmode benötigt mal schauen.

    mfg. Patrick



  • Hallo Shade of Mine,

    Danke für die inspirierenden Fragen 😉 ! So erneut ein Done! Hat aber was länger gedauert als 15 Minuten 😃 , noch viel verbessert und geändert. Ist alles 100% abwärtskompatibel!

    Beispiel 1.

    N:M Beziehung
    Abstract & Extended ORM Classes

    <?php
    
      // phporm inkludieren
      require_once ("phporm/phporm.php");
    
      OrmDBC("mysql");
      echo __PHPORM_VERSION__.'<br>';
      echo DBC::name;
    
      // ein DBC erstellen mit den verbindungsdaten zum DBMS
      $DBC = new DBC("127.0.0.1", "root", "pistazie");
    
      // zum DBMS verbinden oder script abrechen (eine fehlerausgabe
      // kann natürlich implementiert werden)
      If(!$DBC->Connect())
      exit();
    
      // datenbank bestimmen, wenn diese noch nicht
      // existiert wird diese erstellt
      $DBC->DatabaseSet ('books');
    
      // der klasse ORMC den erstellten DBC übergeben
      // als target für die zu erstellenden Klassen (bzw. Tabellen)
      ORMC::SetDBC ($DBC);
    
      // abstrakte orm klasse 'stdID' beschreiben
      // bücher und authoren bekommen
      // jeweils eine ID und einen namen
      $CDS = " stdID abstract{ ID bigint pkey ainc;
                               name char (254);
                             }";
    
      // abstrakte stdID klasse wird nur im interface benötigt
      // eine referenzierung ist nicht nötig
      new ORMC ($CDS);
    
      $CDS = " author extends stdID {}";
      // orm klasse 'autho' registrieren
      $orm_Author = new ORMC ($CDS);
    
      $CDS = " book extends stdID {}";
      // orm klasse 'book' registrieren
      $orm_Book   = new ORMC ($CDS);
    
      $CDS = " authors {book;
                        author;}";
      // orm klasse 'auhtors' registrieren
      $orm_Authors = new ORMC ($CDS);
    
      $books = $orm_Book->GetObjects();
    
      // Nur für den 1. Aufruf nötig
      // legt 3 Bücher und Authoren an
      if(!$books) {
    
      $author1 = $orm_Author->NewObject(array('name'=>'author nummer 1'));
      $author2 = $orm_Author->NewObject(array('name'=>'author nummer 2'));
      $author3 = $orm_Author->NewObject(array('name'=>'author nummer 3'));
    
      $orm_Book->NewObject (array('name'=>'Das Buch Nummer 1'));
      $orm_Book->NewObject (array('name'=>'Das Buch Nummer 2'));
      $orm_Book->NewObject (array('name'=>'Das Buch Nummer 3'));
    
      $orm_Authors->NewObject (array('book'=>1,'author'=>1));
      $orm_Authors->NewObject (array('book'=>1,'author'=>2));
      $orm_Authors->NewObject (array('book'=>1,'author'=>3));
      $orm_Authors->NewObject (array('book'=>2,'author'=>2));
      $orm_Authors->NewObject (array('book'=>2,'author'=>3));
      $orm_Authors->NewObject (array('book'=>3,'author'=>1));
    
      $books = $orm_Book->GetObjects();
      }
    
      if($books)
      // Bücher durchgehen
      foreach ($books as $book) {
        echo "<h1>Book: $book->name</h1>";
    
          // authoren des buches holen
          $authors = $orm_Authors->GetObjects(array("book"=>$book->id));
    
          if($authors) // authoren gefunden
          foreach ($authors as $link) { // eintrag als $link beschreiben
            // autor über $link->author holen
            $author = $orm_Author->GetObject( $link->author );
            if($author)
            echo "<h4>Author: $author->name</h4>";
          }
    
      }
    ?>
    

    Beispiel 2.

    Arbeiten mit vorhandenen Tabellen, da wo bestimmte Rechte zb. nur den Zugriff auf vorhandene Tabellen oder Datenbanken zulassen.

    <?php
      /*
       * Dieses Beispiel läuft nur mit
       * existierenden tabellen !
       *
       * */
    
      // phporm inkludieren
      require_once ("phporm/phporm.php");
    
      OrmDBC("mysql");
      echo __PHPORM_VERSION__.'<br>';
      echo DBC::name;
    
      // ein DBC erstellen mit den verbindungsdaten zum DBMS
      $DBC = new DBC("127.0.0.1", "root", "pistazie");
    
      // zum DBMS verbinden oder script abrechen (eine fehlerausgabe
      // kann natürlich implementiert werden)
      If(!$DBC->Connect())
      exit();
    
      // datenbank bestimmen, wenn diese noch nicht
      // existiert wird diese erstellt
      $DBC->DatabaseSet ('books');
    
      // der klasse ORMC den erstellten DBC übergeben
      // als target für die zu erstellenden Klassen (bzw. Tabellen)
      ORMC::SetDBC ($DBC);
    
      // orm klasse 'author' laden
      $orm_Author = new ORMC ("author");
    
      $CDS = "book";
      // orm klasse 'book' laden
      $orm_Book   = new ORMC ("book");
    
      // orm klasse 'authors' registrieren
      $orm_Authors = new ORMC ("authors");
    
      $books = $orm_Book->GetObjects();
    
      if($books)
      // Bücher durchgehen
      foreach ($books as $book) {
        echo "<h1>Book: $book->name</h1>";
    
          // authoren des buches holen
          $authors = $orm_Authors->GetObjects(array("book"=>$book->id));
    
          if($authors) // authoren gefunden
          foreach ($authors as $link) { // eintrag als $link beschreiben
            // autor über $link->author holen
            $author = $orm_Author->GetObject( $link->author );
            if($author)
            echo "<h4>Author: $author->name</h4>";
          }
    
      }
    ?>
    
    1.04b
    -----
    + MODIFY ORMO, ORMC
     .MODIFY syncmodes
     .ADD _AUTO_RECORD_
     .ADD _ACTIVE_RECORD_
     .DELETE old syncmodes
     .MODIFY CDS now you can use the name of a class
     .as identifier if it have a auto increment attribut
     .or one! primary key attribut
    
    + MODIFY ORMC
     .Modify GetObject()
     .now you can call GetObject with auto_increment
     .or primary key value
    
    + MODIFY ORMO
     .MODIFY __construct
     .REMOVE __attribut__
     .REMOVE __identifiers__
     .ADD __destruct()
     .ADD prepare()
     .ADD Sync()
     .ADD Save()
     .ADD Load() // !! temp !!
     .ADD    __keyattribut__ : array
     .ADD    __value__ 	 : array
    

  • Mod

    $authors = $orm_Authors->GetObjects(array("book"=>$book->id));
    

    Das ist aber nicht wirklich besser als das Query selber zu schreiben wenn ich eh alles haendisch machen muss. Das coole an ORM ist ja, dass es mir hilft.

    Ich sollte also

    $authors = $book->authors;
    

    oder etwas vergleichbares machen koennen. Sonst bringt mir das ORM ja nicht viel. Deshalb mag ich zB doctrine.

    Der Grund warum ich gefragt habe ist, weil das ganze naemlich ziemlich tricky ist:

    $book->authors[0]->books[0]->authors[0]->...
    

    sowas ist nicht trivial loesbar. Deshalb haette mich da dein Ansatz interessiert 🙂



  • moin,

    hmm sowas ist noch nicht implementiert, aber mal schaun vllt. schaffe ich das ja heute 😉 !

    Danke für die Idee!, na dann bis Done 😃 .

    mfg. Patrick,

    ??!! ...

    foreach ($books as $book) {
        echo "<h1>Book: $book->name</h1>";
    
          // authoren des buches holen
          $authors = $book->authors;
    
          if($authors) // authoren gefunden
          foreach ($authors as $author) { //
            echo "$author->name<br>";
    

    EDIT ............

    Läuft 😉 !! ähh meine DONE !!!

    100% Abwärtskompatibel !! 😃

    Ist zwar noch nicht ausgbiebig getestet aber das Beispiel unten läuft ohne
    Probleme.

    <?php
    
      // phporm inkludieren
      require_once ("phporm/phporm.php");
    
      OrmDBC("mysql");
      echo __PHPORM_VERSION__.'<br>';
      echo DBC::name;
    
      // ein DBC erstellen mit den verbindungsdaten zum DBMS
      $DBC = new DBC("127.0.0.1", "root", "pistazie");
    
      // zum DBMS verbinden oder script abrechen (eine fehlerausgabe
      // kann natürlich implementiert werden)
      If(!$DBC->Connect())
      exit();
    
      // datenbank bestimmen, wenn diese noch nicht
      // existiert wird diese erstellt
      $DBC->DatabaseSet ('books');
    
      // der klasse ORMC den erstellten DBC übergeben
      // als target für die zu erstellenden Klassen (bzw. Tabellen)
      ORMC::SetDBC ($DBC);
    
      // abstrakte orm klasse 'stdID' beschreiben
      // bücher und authoren bekommen
      // jeweils eine ID und einen namen
      $CDS = " stdID abstract{ ID bigint pkey ainc;
                               name char (254);
                             }";
    
      // abstrakte stdID klasse wird nur im interface benötigt
      // eine referenzierung ist nicht nötig
      new ORMC ($CDS);
    
      $CDS = " author extends stdID {}";
      // orm klasse 'autho' registrieren
      $orm_Author = new ORMC ($CDS);
    
      $CDS = " book extends stdID {}";
      // orm klasse 'book' registrieren
      $orm_Book   = new ORMC ($CDS);
    
      $CDS = " authors {book link author;
                        author link book;}";
      // orm klasse 'auhtors' registrieren
      $orm_Authors = new ORMC ($CDS);
    
      $books = $orm_Book->GetObjects();
    
      // Nur für den 1. Aufruf nötig
      // legt 3 Bücher und Authoren an
      if(!$books) {
    
      $author1 = $orm_Author->NewObject(array('name'=>'author nummer 1'));
      $author2 = $orm_Author->NewObject(array('name'=>'author nummer 2'));
      $author3 = $orm_Author->NewObject(array('name'=>'author nummer 3'));
    
      $orm_Book->NewObject (array('name'=>'Das Buch Nummer 1'));
      $orm_Book->NewObject (array('name'=>'Das Buch Nummer 2'));
      $orm_Book->NewObject (array('name'=>'Das Buch Nummer 3'));
    
      $orm_Authors->NewObject (array('book'=>1,'author'=>1));
      $orm_Authors->NewObject (array('book'=>1,'author'=>2));
      $orm_Authors->NewObject (array('book'=>1,'author'=>3));
      $orm_Authors->NewObject (array('book'=>2,'author'=>2));
      $orm_Authors->NewObject (array('book'=>2,'author'=>3));
      $orm_Authors->NewObject (array('book'=>3,'author'=>1));
    
      $books = $orm_Book->GetObjects();
      }
    
      if($books)
      // Bücher durchgehen
      foreach ($books as $book) {
        echo "<h1>Book: $book->name</h1>";
            // authoren des buches holen
          $authors = $book->author;
    
          if($authors) // authoren gefunden
          foreach ($authors as $author) { // eintrag als $link beschreiben
            echo "<h4>Author: $author->name</h4>";
    
              $abooks = $author->book;
    
                if($abooks) // bücher des Authors ausgeben
                foreach ($abooks as $abook) // eintrag als $link beschreiben
                  echo "<h4> ------ Abook: $abook->name</h4>";
    
          }
    
      }
    


  • also es läuft, siehe EDIT obiger Post!

    Um das beschreiben der Hilfstabelle kommt man aber nicht herum! Vllt. wird sich dass ja noch ändern, aber vorerst denke ich ist diese Lösung auch passabel!?

    Hmm was nun mal ganz wichtig wäre, wäre das Manual einmal überarbeiten 😞 , das is ja sonne Sache wo ich so richtig Lust drauf habe (!Ironie!).

    http://c64.feuerware.com/page/index.php?topics=cmd&cmd=select&id=11

    mfg. Patrick



  • Hatte heute Präsi und Fachgespräch !!

    Habe bestanden und bin somit nun

    Fachinformatiker für Anwendungsentwicklung !!!

    *MEGAFREU UND STOLZ


Anmelden zum Antworten