Создание слоя модели с PDO
В настоящее время я занимаюсь разработкой инфраструктуры приложений MVC, и я пришел за советом относительно того, как мне следует создавать свои модели.
Модель построена так, что каждая модель сопоставляется с таблицей в базе данных для этих приложений, поэтому типичное приложение будет иметь
- конфигурация
- темы
- Форумы
и каждый будет сопоставлен с именем файла PHP, например, app/models/configuration.php
Теперь проблема, которую я имею, заключается в создании родительского класса базы данных, чтобы иметь возможность обрабатывать определенные данные таблицы, например:
class PDOModel
{
public function __construct()
{
$this->__Communicator = Registry::getPDOInstance();
}
public function getSingle($id)
{
return /*Row*/;
}
/*Etc*/
}
А потом что-то вроде этого для модели приложения
class Model_Topic extends PDOModel
{
protected $__id_column = 'id';
}
и тогда в моем контроллере я могу использовать так:
$Topic = $this->model->topic->get(22);
Но я также хотел бы принять во внимание автоматическое объединение таблиц, есть ли какие-нибудь простые легковесные библиотеки, которые были протестированы и соответствуют моим требованиям.
Любая помощь будет высоко оценен.
2 ответа
Ваш базовый класс модели не должен наследоваться от класса доступа к базе данных. Скорее, он должен использовать класс базы данных (или маппер, который говорит, что это всегда должна быть база данных?), А затем предоставлять методы ORM (get, insert, update и т. Д.).
Как уже писали другие, вы должны использовать одно из множества готовых решений. Что касается поиска облегченного ORM, другие уже спрашивали об этом раньше. Вот ссылка на один из этих вопросов:
https://stackru.com/questions/1995834/looking-a-lightweight-php-orm
Самое близкое, что я видел, - это Zend_Db, который реализует шлюзы Table и Row поверх PDO. Он имеет поддержку для объединения связанных таблиц, а что нет.
Как правило, то, о чем вы просите, не будет таким "легким", это будет своего рода полная ORM. Лично на твоем месте я бы просто пошел с приличным ОРМ. Propel >= 1.5, Доктрина 1.2 или Доктрина2.