Работа с 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.