====== Краткое описание пакета ACTIVE_RECORD ====== Пакет ACTIVE_RECORD представляет средства для удобного отображения доменной логики в реляционную модель базы данных(ORM - Object to Relational Mapping). Пакет реализует [[wp>ActiveRecord|паттерн ActiveRecord]] и значительно расширяет его, добавляя функционал, встречаемый в более сложных ORM решениях, например, средства по управлению связями, коллециями, value objects и проч. За реализацию паттерна в пакете отвечает класс **lmbActiveRecord**. Первоначальная идея пакета ACTIVE_RECORD взята из фреймворка [[http://rubyonrails.com|Ruby-On-Rails]]. Rails в данном случае выступали в качестве функционального ориентира, но мы не копировали полностью его API и функционал, а реализовывали только то, что было необходимо в текущий момент. При реализации паттерна %%ActiveRecord%%, как правило, объекты хранятся в одной таблице базы данных. По-сути, lmbActiveRecord - это посредник между клиентским кодом и одной записью в одной таблице базы данных. В простейших случах, lmbActiveRecord позволяет полностью избавить разработчика от работы с SQL-кодом. Основные характеристики пакета ACTIVE_RECORD: * Автоматическое определение наименований и типов полей таблицы, с которой работает lmbActiveRecord. * Поддержка отношений один-к-одному, один-ко-многим и много-ко-многим. * Поддержка %%ValueObjects%% * Поддержка наследования в рамках одной таблицы (Single Table Inheritance). * Поддержка "отложенной загрузки" (%%LazyLoading%%) для коллекций. * Тесная интеграция с шаблонными системами WACT и MACRO. Пакет ACTIVE_RECORD отлично подходит для быстрой разработки приложений, особенно административной части. В случае, если необходима лучшая скорость, пакет легко представляет возможность ручного формирования SQL-запросов. ===== Пример работы с классом lmbActiveRecord ===== Основной класс пакета 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 можно так: '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 является дочерним классом от [[limb3:ru:packages:core:lmb_object|lmbObject]], поэтому он автоматически поддерживает методы вида setName($value) или getLastName(). Можно также использовать обычные set/get методы, например, set('name', $value); Метод **save()** - создает новую или сохраняет существующую запись в таблице базы данных. В нашем случае это будет таблица **user**. Каждый объект lmbActiveRecord после сохранения имеет свой уникальный идентификатор, который можно получить при помощи метода getId(). Если в конструктор lmbActiveRecord передается int значение, то по-умолчанию, lmbActiveRecord пытается загрузить объект, первичным ключом которого является переданное значение. Альтернативно, объекты можно загружать из БД по первичному ключу при помощи метода findById($id). Это был самый простейший пример работы с классом lmbActiveRecord, теперь рассмотрим принципы работы с ним по-подробнее.