Symfony 2.3 » Этап 3 » Propel 1.6 создаем структуру таблиц
Как создать схему данных, как сгенерировать модели и фикстуры.
~ ~ ~
После описания схемы нужно сгенерировать классы-модели данных:
Это означает, что фикстуры загружаются в не правильном порядке и вам необходимо задать порядок с помощью числовых префиксов. Переименуйте файлы и добавьте к имени каждого файла число. Чем меньше число - тем раньше будет загружен файл.
~ ~ ~
Создадим схему данных
<?xml version="1.0" encoding="UTF-8"?>
<database name="default" namespace="Acme\DemoBundle\Model" defaultIdMethod="native">
<table name="section" phpName="Section">
<column name="id" type="integer" required="true" primaryKey="true" autoIncrement="true" />
<column name="name" type="varchar" size="100" />
<column name="pid" type="integer" defaultValue="null"/>
<foreign-key foreignTable="section" phpName="Parent" refPhpName="Children">
<reference local="pid" foreign="id" />
</foreign-key>
</table>
<table name="author">
<column name="id" type="integer" required="true" primaryKey="true" autoIncrement="true" />
<column name="full_name" type="varchar" size="50" />
</table>
<table name="article">
<column name="id" type="integer" required="true" primaryKey="true" autoIncrement="true" />
<column name="title" type="varchar" primaryString="1" size="100" />
<column name="description" type="varchar" size="255" />
<column name="content" type="longvarchar" />
<column name="author_id" type="integer" />
<column name="section_id" type="integer" />
<foreign-key foreignTable="author">
<reference local="author_id" foreign="id" />
</foreign-key>
<foreign-key foreignTable="section">
<reference local="section_id" foreign="id" />
</foreign-key>
</table>
</database>
Справочники: свойства таблицы, атрибуты полей, внешние ключи, После описания схемы нужно сгенерировать классы-модели данных:
php app/console propel:build --insert-sql --verbose
Добавление тестовых данных
Теперь опишем и добавим некоторые тестовые данные.
# 10_author.yml
Acme\DemoBundle\Model\Author:
author1:
FullName: Sorbing (Stanislav Butsenko)
author_potencier:
FullName: Fabien Potencier
# 20_section.yml
Acme\DemoBundle\Model\Section:
section_dev:
Name: Development
section_php:
Name: PHP
Pid: section_dev
section_sf:
Name: Symfony 2.3
Pid: section_php
section_propel:
Name: Propel 1.6
Pid: section_php
section_js:
Name: JavaScript
Pid: section_dev
# 30_article.yml
Acme\DemoBundle\Model\Article:
article_symfony:
Title: Symfony 2.3 Installing and Configuring Symfony
Description: How to install Symfony 2.3
Content: The goal of this chapter is to get you up ...
AuthorId: author1
SectionId: section_sf
article_propel:
Title: Propel 1.6 Column element
Description: About Column Attributes
Content: For performance reasons, it is often a good idea to set BLOB ...
AuthorId: author1
SectionId: section_propel
article_twig_ext:
Title: Twig Form Extension
Description: How to Create a Custom Form Field Type
Content: Symfony comes with a bunch of core field types available for building forms.
AuthorId: author_potencier
SectionId: section_sf
И выгрузим эти данные в БД:
php app/console propel:fixtures:load
[Propel] Exception
Если вы видите сообщение:The object "author1" from class "Acme\DemoBundle\Model\Author" is not defined in your data file.
Это означает, что фикстуры загружаются в не правильном порядке и вам необходимо задать порядок с помощью числовых префиксов. Переименуйте файлы и добавьте к имени каждого файла число. Чем меньше число - тем раньше будет загружен файл.
Проверка "связи"
Теперь напишем запрос к БД в контроллере для проверки работоспособности Propel'а. Открываем /src/Acme/DemoBundle/Controller/WelcomeController.php и в методе indexAction напишем простой запрос:
$author = \Acme\DemoBundle\Model\AuthorQuery::create()->findOneById(1);
echo "<pre>"; print_r($author->toArray()); echo "</pre>";
exit;
Если мы видим вывод данных добавленного ранее пользователя - значит все прошло успешно!