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:
Verwendung sieht dann beispielsweise so aus:
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.
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() {}
}
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) ) );
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