Несколько советов: [основываясь на моем собственном опыте и каркасах, которые я уже использовал]
В основном, что вы должны / хотите / могли бы сделать, - это создать суперкласс для всех предложений в вашей модели.Этот класс будет содержать ссылку на экземпляр базы данных, и он будет иметь все общие методы для вашей модели, например getById($id)
, getAll()
, getPaginated()
и т. Д.
Другая цель этого суперклассаэто отобразить результаты из базы данных в экземпляры классов вашей модели.Таким образом, в конце ваш пользовательский класс будет иметь только те свойства, методы доступа и методы, которые специфичны для этого класса, например, специальные запросы или что-то в этом роде.
Вот пример того, как это может выглядеть:
Class Model{
protected function getById($_id){
$_table = get_class($this);
$anonymous = $this->_getObjectById($_table,$_id); //this method will execute a query (unsing PDO) and return a StdClass object with the results
$this->mapTable($anonymous,$_table); //this method will take the StdClass instance and will transform it into a $_table Instance
}
private function mapTable($stdInstance,$model_name){
foreach($stdInstance as $key => $value){
try{
if(property_exists($this,$key)){
$this->$key = $value; //you could declare the model's properties as protected... or you could create accessors and call them here
}
} catch(Exception $ex) {
/* something went wrong o_O */
}
}
Class User extends Model{
protected $id;
protected $name;
.....
}
Class Controller{
public function index(){
$user = new User();
$user->getById($_GET['id']);
print_r($user);
//now you can pass the $user object to the View to display it
}
}
в нескольких словах ... Класс Model очень маленький ORM .Вы можете попытаться создать свой собственный ORM (как я это сделал), но вы столкнетесь с множеством проблем при попытке сопоставить отношения между объектами: Nx1,1xN, NxN, 1x1, наследование, «более глубокие отношения» и n + 1 проблема .Вам также необходимо каким-то образом определить структуру модели, чтобы ваш ORM мог ее понять, возможно, используя файлы YAML / XML или считывая структуру непосредственно из структуры таблицы вашей базы данных, или имея соглашение об именовании в ваших свойствах ...
это действительно интересное поле:)
Надеюсь, это поможет и удачи