Начал изучать Doctrine и в документации описывается пример работы на основе PHP-класса, но так же говорится, что таблицу можно описывать в YML-файле. Лично для меня это намного приятный для чтения формат представления данных, и тут есть свои нюансы, о которых ниже.
И так поехали, будем эксперементировать на примере созданного ранее бандла HelloBundle
Создание сущностного класса
1. создаем файл называемый “сущность”, что значит базовый класс, содержащий данные:
/Symfony/src/Acme/HelloBundle/Entity/Product.php
<?php
namespace Acme\HelloBundle\Entity;
class Product
{
}
если забыть создать этот файл, то в пункте 4 мы получим ошибку:
[RuntimeException]
Unable to determine where to save the "Acme\HelloBundle\Entity\Product" class (use the --path option).
2. создаем YAML определения метаданных в файле /Symfony/src/Acme/HelloBundle/Resources/config/doctrine/Product.orm.yml
Acme\HelloBundle\Entity\Product:type: entitytable: bookmarksid:id:type: integergenerator: { strategy: AUTO }fields:name:type: stringlength: 100uri:type: textdateAdded:type: integer
отлично, наша таблица описана, однако в документации, чтобы не усложнять, опущен момент комментирования полей и самой таблицы, поэтому такой пример я решил привести ниже:
Entity\Example:type: entitytable: examplefields:id:type: integerid: truegenerator:strategy: AUTOlabel:type: stringcolumnDefinition: varchar(255) NOT NULL DEFAULT 'default_value' COMMENT 'This is column comment'
или еще более простой вариант:
MyModel:columns:count:type: integercomment: 'Column comments accept a maximun of 255 characters.\nThey can also include newline characters (\\n) each one of which counting as one characters.\nThis way you can easily explain each column to database administrators that do not know about your application.'options:comment: 'Table comments can be 60 characters long but no line breaks!'
этот вариант сгенерирует следующий SQL-запрос:
CREATE TABLE my_model (
id BIGINT AUTO_INCREMENT,
count BIGINT COMMENT 'Column comments accept a maximun of 255 characters.\nThey can also include newline characters (\\n) each one of which counting as one characters.\nThis way you can easily explain each column to database administrators that do not know about your application.',
PRIMARY KEY(id)
)
COMMENT = 'Table comments can be 60 characters long but no line breaks!'
ENGINE = INNODB;
Создание геттеров и сеттеров
1. чистим кэш, как это сделать я писал ранее »
2. в консоле выполняем команду
php app/console doctrine:generate:entities Acme/HelloBundle/Entity/Product
3. смотрим в /Symfony/src/Acme/HelloBundle/Entity/Product.php и видим, что в файл прописались все гетеры и сетеры, которые мы объявили в YAML-файле.
*обратите внимание, рядом появился файл Product.php~ это тот код, который был до выполнения команды (предыдущая версия файла).
Создание таблиц/схемы для базы данных
php app/console doctrine:schema:update --force
ну а дальше все как в документации.
Отказываемся от YAML
Как показывает опыт дальнейшей разработки, использование YAML оказывается не очень удобным т.к. при изменении, добавлении или удаления поля, приходится вносить изменения не только в YAML-файл, но и в файл сущности /Symfony/src/Acme/HelloBundle/Entity/Product.php
Создаем уникальный индекс
Все бы хорошо, но пришлось столкнуться с проблемой добавления индекса, на всех сайтах что я успел нагуглить пишут, что делается это с помощью добавления следующей строчки в описание таблицы:
<?php
namespace Acme\HelloBundle\Entity;
use Doctrine\ORM\Mapping as ORM;
/**
* @ORM\Entity
* @ORM\Table(name="bookmarks", uniqueConstraints={@UniqueConstraint(name="uri_md5",columns={"uri_md5"})})
*/
class Product
{
как видно из примера мы делаем поле uri_md5 уникальным индексом который назовем одноименно uri_md5
но, если Вы решите синхронизировать Вашу сущность с таблицей, с помощью команды:
php app/console doctrine:schema:update --force
то получите ошибку:
[Doctrine\Common\Annotations\AnnotationException]
[Semantical Error] The annotation "@UniqueConstraint" in class Acme\HelloBundle\Entity\Product was never imported. Did you maybe forget to add a "use" statement for this annotation?
и правильно, потому что нужно было написать так:
<?php
namespace Acme\HelloBundle\Entity;
use Doctrine\ORM\Mapping as ORM;
/**
* @ORM\Entity
* @ORM\Table(name="bookmarks", uniqueConstraints={@ORM\UniqueConstraint(name="uri_md5",columns={"uri_md5"})})
*/
class Product
{
Создание геттеров и сеттеров
При этом, генерацию гетеров и сетеров можно выполнить командой:
$ app/console doctrine:generate:entities AcmeHelloBundle:Product
надеюсь, Вы пополнили свой багаж знаний и готовы к изучению нового, всем удачки!
Комментарии
Комментариев пока нет.