Ankündigung

Einklappen
Keine Ankündigung bisher.

[Erledigt] Struktur einer Mapper-Klasse

Einklappen

Neue Werbung 2019

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

  • #16
    Ich habe das eine Weile so gehandhabt verschiedene Methoden zum Selektieren nach verschiedenen Kriterien bereitzustellen. Damit war ich aber auf Dauer nicht zufrieden, ist mir auf Dauer zuviel Wartungsaufwand wenn mal neue Felder nach denen selektiert wird dazu kommen oder wegfallen.

    Momentan bin ich da am rumprobieren und basteln, momentan sieht das im Groben so aus:
    PHP-Code:
    <?php
    abstract class Base_Repository {
        protected 
    $db;
        protected 
    $table;
        protected 
    $pkField;
        protected 
    $modelClass;
        protected 
    $properties = array();
        protected 
    $lazySave   = array();
        protected 
    $cache      = array();
        protected 
    $cachedAll  false;
        protected 
    $statement  null;

        public static function 
    factory(mysqli $db,$table,$pkField,$modelClass) {}
        public function 
    __construct(mysqli $db,$table,$pkField,$modelClass) {}
        public function 
    __destruct() {}
        public function 
    __get($property) {}
        public function 
    __call($name$arguments) {}
        public function 
    setTable($table) {}
        public function 
    setPkField($pkField) {}
        public function 
    setModelClass($modelClass) {}
        public function 
    setProperty(Base_Property $property) {}
        public function 
    setProperties(array $properties) {}
        public function 
    getProperty($property) {}
        public function 
    getProperties() {}
        public function 
    hasProperty($property) {}
        public function 
    create(array $data,$lazySave=true) {}
        public function 
    save($object,$lazySave=true) {}
        public function 
    find($columns=null) {}
        public function 
    orderBy($column,$direction="ASC") {}
        public function 
    limit($count,$offset=0) {}
        public function 
    delete($object) {}
        public function 
    saveAll(array $objects) {}
    }

    abstract class 
    Base_Model {
        protected 
    $properties = array();
        
        public function 
    injectProperties(array $properties) {}
        public function &
    __get($property) {}
        public function 
    __set($property,$value) {}
        public function 
    as_array() {}
        public function 
    as_json() {}
    }

    class 
    Select_Statement {
        protected 
    $validDirections = array("ASC","DESC");
        protected 
    $repository;
        protected 
    $queryString;
        protected 
    $columns;
        protected 
    $conditions     = array();
        protected 
    $bindValues     = array("");
        protected 
    $orderByColumn  null;
        protected 
    $orderDirection null;
        protected 
    $limitCount     null;
        protected 
    $limitOffset    null;

        public function 
    __construct(Base_Repository $repository,array $columns=null) {}
        public function 
    addCondition(Base_Condition $condition) {}
        public function 
    build() {}
        public function 
    query() {}
        public function 
    pk($value) {}
        public function 
    all() {}
        public function 
    filter() {}
        public function 
    orderBy($column,$direction="ASC") {}
        public function 
    limit($count,$offset=0) {}
    }

    class 
    Base_Condition {
        protected 
    $repository;
        protected 
    $property;
        protected 
    $condition;
        protected 
    $value;
        
        public function 
    __construct(Base_Repository $repository,Base_Property $property) {}
        public function &
    __get($property) {}
        public function  
    __toString() {}
        public function 
    eq($value) {}
        public function 
    neq($value) {}
        public function 
    gt($value) {}
        public function 
    lt($value) {}
        public function 
    like($value) {}
        public function 
    _and() {}
        public function 
    _or() {}
        public function 
    _xor() {}
    }
    Verwendung sieht dann beispielsweise so aus:
    PHP-Code:
    $db = new mysqli("localhost","root","","tests");

    class 
    User_Repository extends Base_Repository {
        public function 
    __construct(mysqli $db) {
            
    parent::__construct($db,"user","id","User_Model");
            
    $this->setProperty(new Base_Property("id","i",null));
            
    $this->setProperty(new Base_Property("name","s",null,"string",3,30));
            
    $this->setProperty(new Base_Property("email","s",null,"email"));
            
    $this->setProperty(new Base_Property("language","s","de-DE","string",5,5));
            
    $this->setProperty(new Base_Property("customer_id","i",0,"int"));
        }
    }
    class 
    User_Model extends Base_Model {}


    $User = new User_Repository($db);
    // Komplette Userliste holen
    $User->find()->all();
    // Den ersten User bei aufsteigender Sortierung nach Name
    $User->find()->filter($User->orderBy("name","asc")->limit(1));
    // Namen und Email aller User zu customer 23 holen
    $columns = array("name","email");
    $User->find($columns)->filter($User->customer_id()->eq(23));
    // User mit der id 42 holen
    $User->find()->pk(42);
    // Alle User mit Spracheinstellung de-DE und Name beginnend mit a holen
    $User->find()->filter(
                    
    $User
                        
    ->language()->eq("de-DE")
                        ->
    _and()
                        ->
    name()->like("a%")
    );
    // Prüfen ob eine Email-Adresse bereits vergeben ist
    count$User->find()->filter$User->email()->eq($email) ) ); 
    Das macht die Nutzung für einfache Queries schon recht komfortabel.
    Gebaut habe ich mir das Ganze erstmal mehr oder weniger aus Spaß und will es auch noch weiter ausbauen.
    Generell ist es aber wohl sinnvoller gleich auf ein fertiges - und bewährtes - ORM zu setzen, wenn man das ganze so weit abstrahiert haben möchte.

    Kommentar


    • #17
      Was mir gerade auffällt:
      Entweder Camel-Case _oder_ Unterstrich
      in und not fehlt bei der Condition

      Kommentar


      • #18
        Zitat von xm22 Beitrag anzeigen
        Was mir gerade auffällt:
        Entweder Camel-Case _oder_ Unterstrich
        in und not fehlt bei der Condition
        Stimmt, da hast du Recht.
        Bei den Conditions fehlt auch noch mehr denke ich. Spontan fallen mir z.B. noch gte (>=) und lte (<=) ein.

        Kommentar

        Lädt...
        X