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");

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