Схема таблиц XPDO.
XPDO генерирует таблицы базы и классы php согласно правилам, определённым в файле схемы в формате XML. В фале схемы определяется название пакета, которое используется для загрузки и использования схемы.
Объявление таблиц и баз банных.
В качестве примера рассмотрим создание пакета с названием Storefinder. Первым делом необходимо создать файл схемы, именование файла подлежит следующему правилу:
[название схемы].mysql.schema.xml
Если вы заметили, в название файла присутствует название платформы, в нашем случае это MySQL. XPDO позволяет иметь несколько схем для разных платформ баз дынных.
Описание базы.
Для нашей базы данных мы используем следующее описание:
<?xml version="1.0" encoding="UTF-8"?> <model package="storefinder" baseClass="xPDOObject" platform="mysql" defaultEngine="MyISAM" tablePrefix="sf_" phpdoc-package="storefinder" phpdoc-subpackage="model" version="1.1">
Первая строка содержит стандартное описание версии XML, оно необходимо для синтаксического анализатора и определено стандартом XML. Вторая строчка содержит описание модели указанное в атрибутах тега model. Ниже следует описание атрибутов:
Package - атрибут определяет название нашего пакета которое мы будет использовать для загрузки нашей схемы.
baseClass – все ваши схемы должны наследоваться от базового класса. Для пользовательских схем XPDO в большинстве случаев подходит значение по умолчанию xPDOObject .
platform - XPDO поддерживает разные платформы, мы ипользуем MySQL по этому следует указать mysql
defaultEngine - вы можете указать движок хранения используемы по умолчанию для ваших таблиц. Мы будем использовать MyISAM.
tablePrefix – опционально можно установить переопределение префикса для таблиц. Подробнее этот атрибут будет рассмотрен позже.
phpdoc-package & phpdoc-subpackage – эти атрибуты мы будем использовать в нашей базе и классах файлов. Это не стандартные атрибуты, мы используем их что бы показать возможность указывать любые свойства в атрибутах нашей модели.
Version – версия схемы определяет то, как модель будет обрабатываться XPDO
Версия 1.1
Обратите внимание что версия 1.1 была изменена для отдельно описания таблицы индексов отдельно от индекса элементов полей. Если вы не используете эту возможность, не меняйте версию на 1.1
Определение таблиц.
После описание схемы базы данных мы можем определить наши таблицы. Добавим:
<object class="sfStore" table="stores" extends="xPDOSimpleObject">
Object является описанием таблицы которую мы сгенерируем позже. Опишем значение атрибутов:
class - название класс который мы хотим получить из таблицы. Хороши опытом будет использование префиксов в названиях классов, чтобы предотвратить конфликты с другими пакетами.
table – сдесь следует указать название таблицы убрав из него префикс указанный для нашей модели.
extends - таблицы должны наследовать класс xPDOObject или его потомка. Обратите внимание что вы можете расширят существующие классы в своей XML и ваш объект будет наследовать поля указанные в родительском объекте.
Здесь мы наследуем нашу таблицу от xPDOSimpleObject. Этот объект расширяет наш xPDOObject добавляя в него поле ID с auto_increment, что позволит нам не указывать это поле явно в наших таблицах.
Сейчас добавим в нашу таблицу описание нескольких полей:
<field key="name" dbtype="varchar" precision="100" phptype="string" null="false" default="" index="index" /> <field key="address" dbtype="varchar" precision="255" phptype="string" null="false" default="" /> <field key="city" dbtype="varchar" precision="255" phptype="string" null="false" default="" /> <field key="state" dbtype="varchar" precision="255" phptype="string" null="false" default="" /> <field key="zip" dbtype="varchar" precision="10" phptype="string" null="false" default="0" index="index" /> <field key="country" dbtype="varchar" precision="20" phptype="string" null="false" default="" /> <field key="phone" dbtype="varchar" precision="20" phptype="string" null="false" default="" /> <field key="fax" dbtype="varchar" precision="20" phptype="string" null="false" default="" /> <field key="active" dbtype="int" precision="1" attributes="unsigned" phptype="integer" null="false" default="0" />
Мы перечислили в теге field колонки нашей таблицы, в атрибутах указаны свойства наших данные и другие параметры базы данных. Рассмотрим параметры который мы использовали:
key – имя колонки.
dbtype – тип данных используемый базой.
precision - определяет кол-во памяти используемые полем.
attributes - поле используется для типов данных для которых возможно значение «unsigned» что бы делать проверку на положительно значение.
phptype - тип данных который будет использовать PHP
null - указывает может ли поле иметь значение Null
default - значение по умолчанию для поля
index (deprecated) – это атребут добавляет полю тип указателя PK, indexили FK (поле актуально только для версии 1.0)
Теперь мы определим индексы:
<index alias="name" name="name" primary="false" unique="false" type="BTREE"> <column key="name" length="" collation="A" null="false" /> </index> <index alias="zip" name="zip" primary="false" unique="false" type="BTREE"> <column key="zip" length="" collation="A" null="false" /> </index>
Псевдоним элемента
Новое в xPDO 2.2 является возможность определять поле псевдонимов. Это может быть полезно при изменении структуры таблиц, чтобы сохранить обратную совместимость, или для определения полезной псевдонимы для объектов API без необходимости изменения структуры таблицы.
<alias key="postalcode" field="zip" />
Здесь всё просто и не требует разъяснений.
И чтобы закончить определение нашей таблицы добавим закрывающий тег:
</object>
Добавим ещё пару таблиц в нашу модель. Сейчас мы определим класс sfOwner :
<object class="sfOwner" table="owners" extends="xPDOSimpleObject"> <field key="name" dbtype="varchar" precision="100" phptype="string" null="false" default="" index="index" /> <field key="email" dbtype="varchar" precision="255" phptype="string" null="false" default="" /> <index alias="name" name="name" primary="false" unique="false" type="BTREE"> <column key="name" length="" collation="A" null="false" /> </index> </object>
У нашего магазина возможно наличие нескольких владельцев, по этому добавим таблицу sfStoreOwner что обеспечит отношение многие-ко-многим
<object class="sfStoreOwner" table="store_owners" extends="xPDOSimpleObject"> <field key="store" dbtype="int" precision="10" attributes="unsigned" phptype="integer" null="false" default="0" index="index" /> <field key="owner" dbtype="int" precision="10" attributes="unsigned" phptype="integer" null="false" default="0" index="index" /> <index alias="store" name="store" primary="false" unique="false" type="BTREE"> <column key="store" length="" collation="A" null="false" /> </index> <index alias="owner" name="owner" primary="false" unique="false" type="BTREE"> <column key="owner" length="" collation="A" null="false" /> </index> </object>
Наша модель почти готова, осталось добавить закрывающий тег:
</model>
Теперь вы закончили описание схемы нашей модели, не забудьте сохранить файл. Следующим шагом мы определим отношения между нашими таблицами.