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");
    
      
    
Класс сущности - обычный класс и может быть расширен любыми необходимыми методами. Например: проверка юзера по логину и паролю.