Работа с Doctrine у Symfony framework. Основы (Урок 10. Doctrine)
Итак, мы уже теоретически знаем (здесь могли прочитать), для чего Doctrine, какие она дает преимущества в сравнении с "голыми" sql запросами. Теперь переходим к практике.
Как уже советовал в предыдущем уроке, самый простой путь - создать ORM на основе существующей базы данных. Для этого понадобится всего две команды:
php app/console doctrine:mapping:import Имя_бандла формат_конфига
Таким образом мы создадим конфиг для построения модели. Формат может быть разным, например, yml, xml и т.д. После этого создадим ORM:
php app/console doctrine:generate:entities Имя_бандла
На этом создание ORM можно считать оконченным. При чем если таблицы были связаны, все необходимые связи сразу же были созданы в модели. Можно начинать работу с БД.
Примечание. В результате первой команды создается конфигурация БД (по умолчанию у src/Path_to_bundle/Resources/config/doctrine. Иногда приходится ее править, например, для возможности задания значений по умолчанию, об этом в одной из следующих заметок.
Вторая команда генерирует классы т.н. mapping, вместе с т.н. getters и setters методами. (По умолчанию, в src/Path_to_bundle/Entity). Эти классы и есть представление таблиц БД.
Если у вас нету готовой БД и вы хотите ее создать, вызовите
php app/console doctrine:database:create
Удаление ДБ возможно командой
php app/console doctrine:database:drop --force
Дальше
php app/console doctrine:generate:entity
Это вызовет интерактивный генератор. Следуя его инструкциям, вы создадите модель (mapping). На основании этой модели можно создать таблицы в БД. После завершения работы с интерактивным генератором, создадим модель, как уже писалось раньше
php app/console doctrine:generate:entities Имя_бандла
Создать таблицы в базе, используя mapping:
php app/console doctrine:schema:update --force
Переходим непосредственно к работе с БД, используя Doctrine. Эта заметка вводная, так что пока что будем обходится без DQL-запросов.
Ака SELECT Чтобы сделать простую выборку с одной таблицы БД, достаточно написать в контроллере:
$product = $this->getDoctrine()
->getRepository('Bundle:table')
->find($id);
Метод find($id) делает выборку по id (по primary key). Кроме этого, есть методы
findOneById($id),
findAll() - получаем все записи в таблице,
findBy(array('field'=>'value')) - выборка с условием, например,
$products = $repository->findBy(
array('name' => 'foo'),
//А это сортировка array('price' => 'ASC') );
Как вы, наверное, догадались, тип $products - это наша сгенерированная модель (mapping). (То, что в src/Path_to_bundle/Entity)
Ака INSERT/UPDATE Очень удобно, что при использовании Doctrine разница между добавлением записи и обновлением существующей минимальная. Все зависит только от того, какой объект вы обновляете - тот, для которого был сделан прежде SELECT, или нет.
Начнем с добавления (INSERT) в БД:
//Получаем менеджер БД - Entity Manager
$em = $this->getDoctrine()->getManager();
//Создаем экземпляр модели $product = new Product;
//Задаем значение полей $product->setValue('value'); ...
//Передаем менеджеру объект модели $em->persist($product)
//Добавляем запись в таблицу $em->flush();
Обновление (UPDATE) отличается тем, что надо сначала выбрать запись для обновления. И все!
//Получаем менеджер БД
$em = $this->getDoctrine()->getManager();
//Выбираем запись для обновления - в этой строке вся разница $product = $em->getRepository('AcmeStoreBundle:Product')->find($id);
//Задаем значение полей $product->setValue('value'); ...
//Передаем менеджеру объект модели $em->persist($product)
//Добавляем запись в таблицу $em->flush();
Ака DELETE
Для удаления, нужно только вызвать remove() вместо persist():
$em->remove($product);
$em->flush();
На этом пока все. Мы научились выполнять элементарные действия с БД в Symfony framework, используя Doctrine.