ZDB

Библиотека для доступа к БД
Библиотека представляет собой, Active Record построеный на функциональности библиотекаи ADODB. Библиотека позваляет работать с бизнес-сущностями не используя маппинг или иной способ явного указания связи полей бизнес-сущности с полями таблицы БД.

Основной репозитарий на гитхабе

Описание идеи в статье на хабре

Документация по классам библиотеки

ZDB\DB

Класс, реализующий конект к БД. Синглетон-обертка для ADODB.
Для инициализации необходимо передать параметры соединения.
\ZCL\DB\DB::config($host, $dbname,$dbuser,$dbpass,[$driver=mysqli]);
Получение конекта (для нативных запросов)
DB::getConnect();

ZDB\Entity

Основной класс библиотеки, являющийся базовым для всех Entity.

К примеру есть таблица пользователей


   CREATE TABLE   `users` (
  `username` varchar(255) ,
  `updated` date  ,
  `user_id` int(11) NOT NULL AUTO_INCREMENT,
  PRIMARY KEY (`user_id`)
)
Создадим класс сущности Пользователь, на основе класса ZDB\Entity

/**
 * @table=users
 * @keyfield=user_id
 */
class User extends Entity{
  
    protected function init() {
        $this->user_id = 0;
        $this->updated = time();
    }

    protected function afterLoad() {

            $this->updated = strtotime($this->updated);
    }    
}
Если у нас есть представление для выборки пользователей например usersview тогда мы указываем в псевдоаннотациях @view=usersview. В этом случае выборка данных будет идти из представления а запись в таблцу.
Метод init() используется для инициализации полей.
Метод afterLoad() вызывается после загрузки содержимого из соответствующей строки таблицы БД. В данном случае преобразовывает дату в timestamp для универсальности дальнейшей работы.
Оба метода необязательны. Самое важное - имена полей, к которым идет обращение при работе с экземпляром сущности должны совпадать с именами в таблице БД. Все остальное будет автоматизировано библиотекой ADODB. При сохранении данных библиотека сама определит типы полей Бд и сформирует SQL запрос с соответствующими преобразованиями. Никакого специального маппинга полей или генерации структур не нужно.
Некоторые примеры работы с Entity:

  //загрузка пользователя.
  $user = User::load($id);
  
  //записать  пользователя с  новыми  значениями.
  $user->username='newname';
  $user->updated = time();
  $user->save();

  //новый пользователь
  //если $user->user_id равен 0 создается новая запись  и полю $user->user_id  
  //присваивается значение  из  автоинкрементного поля.
  $user = new  User();
  $user->username='newname';
  $user->save();
  
  //удаление  пользователя
  User::delete($id);
  
  //найти всех  пользователей кроме  админа
  $users = User::find("username  'admin'");

  //найти количество  пользователей
  $users = User::findCnt();
  
  
  //вернуть имена  пользователей в  виде  массива  ключ/значение
  // например для  комбобокса
  $users = User::findArray("username","","username asc");

  
Класс сущности - обычный класс и может быть расширен любыми необходимыми методами. Например проверка юзера по логину и паролю.