Пакет ACTIVE_RECORD представляет средства для удобного отображения доменной логики в реляционную модель базы данных(ORM - Object to Relational Mapping). Пакет реализует паттерн ActiveRecord и значительно расширяет его, добавляя функционал, встречаемый в более сложных ORM решениях, например, средства по управлению связями, коллециями, value objects и проч. За реализацию паттерна в пакете отвечает класс lmbActiveRecord.
Первоначальная идея пакета ACTIVE_RECORD взята из фреймворка Ruby-On-Rails. Rails в данном случае выступали в качестве функционального ориентира, но мы не копировали полностью его API и функционал, а реализовывали только то, что было необходимо в текущий момент.
При реализации паттерна ActiveRecord, как правило, объекты хранятся в одной таблице базы данных. По-сути, lmbActiveRecord - это посредник между клиентским кодом и одной записью в одной таблице базы данных. В простейших случах, lmbActiveRecord позволяет полностью избавить разработчика от работы с SQL-кодом.
Основные характеристики пакета ACTIVE_RECORD:
Пакет ACTIVE_RECORD отлично подходит для быстрой разработки приложений, особенно административной части. В случае, если необходима лучшая скорость, пакет легко представляет возможность ручного формирования SQL-запросов.
Основной класс пакета ACTIVE_RECORD - это класс lmbActiveRecord.
Рассмотрим небольшой пример работы с этим классом.
Предложим, что у нас есть таблица user в базе данных, созданная при помощи такого SQL-кода:
CREATE TABLE `user` ( `id` BIGINT(20) NOT NULL AUTO_INCREMENT, `name` VARCHAR(255) DEFAULT NULL, `last_name` VARCHAR(255) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
Тогда работать с ней при помощи пакета ACTIVE_RECORD можно так:
<?php //если требуется, добавьте путь до директории с Limb3 пакетами //set_include_path('/path/to/dir/with/limb'. PATH_SEPARATOR . get_include_path()); require_once('limb/active_record/common.inc.php'); lmbActiveRecord :: setDefaultDSN(array('driver' => 'mysql', 'host' => 'localhost', 'database' => 'ar_tests', 'user' => 'root', 'password' => 'secret')); class User extends lmbActiveRecord{} $user = new User(); $user->setName('Vasa'); $user->setLastName('Pupkin'); $user->save(); $user_loaded = new User($user->getId()); echo $user_loaded->getName() . ' ' . $user_loaded->getLastName(); // Выведет Vasa Pupkin //альтернативный способ загрузки $user_loaded = lmbActiveRecord :: findById('User', $user->getId()); ?>
Для работы этого скрипта убедитесь, что в include_path содержится путь до вашей инсталляции Limb, а также, что база данных 'ar_test' содержит таблицу user.
Класс lmbActiveRecord является дочерним классом от lmbObject, поэтому он автоматически поддерживает методы вида setName($value) или getLastName(). Можно также использовать обычные set/get методы, например, set('name', $value);
Метод save() - создает новую или сохраняет существующую запись в таблице базы данных. В нашем случае это будет таблица user. Каждый объект lmbActiveRecord после сохранения имеет свой уникальный идентификатор, который можно получить при помощи метода getId().
Если в конструктор lmbActiveRecord передается int значение, то по-умолчанию, lmbActiveRecord пытается загрузить объект, первичным ключом которого является переданное значение.
Альтернативно, объекты можно загружать из БД по первичному ключу при помощи метода findById($id).
Это был самый простейший пример работы с классом lmbActiveRecord, теперь рассмотрим принципы работы с ним по-подробнее.
Обсуждение