Робота з базою та генерація моделей Propel

Робота категорій товарів та товарних моделей відбувається за допомогою ORM Propel. Propel дозволяє автоматично згенерувати класи для швидкого доступу до полів у таблицях бази. В цьому нам допоможе schema.xml і propel.yaml у корені сайту.

Підготовка до створення моделі

1. Внесення поля до schema.xml. Використовуються базові 4 схеми по шляхам.

// для роботи із загальною таблицею route
/application/modules/core/schema.xml

// схема товарів, категорій та всього shop
/application/modules/shop/schema

//схема таблиць smart_filter
/application/modules/smart_filter/schema.xml

// схема таблиць банерів
/application/modules/xbanners/schema.xml

2. Вибравши до якої schema.xml відноситься доопрацювання, шукаємо потрібну таблицю.

2.1. Якщо змінюється таблиця, яка має <behavior name="i18n"> (поведінка для зв'язку з мультимовністю i18n).

Приклад shop_category:

В <table name="shop_category">

додаємо нове поле

<column name="new_our_field" type="varchar" size="255" />

Повний приклад:

<?xml version="1.0" encoding="UTF-8"?>
<database name="Shop" defaultIdMethod="native" baseClass="CMSFactory\PropelBaseModelClass" heavyIndexing="true"
          package="shop.models">
    <table name="shop_category" phpName="SCategory">
        <vendor type="mysql">
            <parameter name="Charset" value="utf8"/>
        </vendor>
        ........   
        <column name="new_our_field" type="varchar" size="255" />
        ........
    </table>
</database>


2.2. Якщо змінюється кінцева таблиця, на яку посилається <behavior name="i18n">, то потрібно додати і в таблицю яка посилається і в таблицю на яку посилається behavior.

Приклад, зробити поле new_our_field мультимовним у shop_category_i18n:

В <table name="shop_category">

додаємо нове поле

<column name="new_our_field" type="varchar" size="255" />

тут же додаємо поле "new_our_field" до:

<behavior name="i18n">
         <parameter name="i18n_columns" value="name, h1, description, new_our_field"/>
         <parameter name="default_locale" value="ua"/>
</behavior>

В <table name="shop_category_i18n">

додаємо нове поле

<column name="new_our_field" type="varchar" size="255" />

Повний приклад:

<?xml version="1.0" encoding="UTF-8"?>
<database name="Shop" defaultIdMethod="native" baseClass="CMSFactory\PropelBaseModelClass" heavyIndexing="true"
          package="shop.models">
    <table name="shop_category" phpName="SCategory">
        <vendor type="mysql">
            <parameter name="Charset" value="utf8"/>
        </vendor>
        ........   
        <column name="new_our_field" type="varchar" size="255" />

        <behavior name="i18n">
            <parameter name="i18n_columns" value="name, h1, description, new_our_field"/>
            <parameter name="default_locale" value="en"/>
        </behavior>
        ........
    </table>

    <table name="shop_category_i18n" phpName="SCategoryI18n">
        <vendor type="mysql">
            <parameter name="Charset" value="utf8"/>
        </vendor>
        ........
        <column name="new_our_field" type="varchar" size="255" />
        ........
    </table>
</database>

3. Створюємо поле зі своїми параметрами в потрібну таблицю в mysql. Наприклад, shop_category або shop_category_i18n.

ALTER TABLE `your_table` ADD `new_our_field` VARCHAR(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '';

Генерація моделі в Linux

1. Заходимо в корінь нашого проекту з терміналу:

// У корені проекту повинен бути propel.yaml
cd /var/www/project.loc

2. Перебуваючи в проекті, запустіть команду генерації моделей (в linux повинен бути встановлений php потрібної версії глобально)

/var/www/project.loc> ./application/third_party/propel/propel/bin/propel -v build

Генерація моделі у Windows

1. Якщо php не стоїть глобально і в Bash консолі не відгукується команда "php -v", то потрібно завантажити php тієї версії, з якою працюватиме ваш сайт (v7.2-7.4).

2. Заходимо з Bash консолів проект

// У корені проекту повинен бути propel.yaml
C:\> cd .\OSPanel\domains\project.loc

3. Команда для генерації в корені проекту (Наприклад, php лежить на шляху "C:\php74\php.exe")

C:\OSPanel\domains\project.loc> C:\php74\php.exe .\application\third_party\propel\propel\bin\propel -v build

Генерація пропелаЯкщо генерація проведена успішно, буде лог і таке повідомлення. Інакше можна ознайомитись із документацією ORM Propel.

Використання

<?php

/* Викликаємо модель категорій */
$category = \SCategoryQuery::create()
          ->joinWithI18n('en', 'INNER_JOIN')
            ->filterById($id)
            ->findOne();

/* Читання з нашого поля new_our_field (з snake_case у camelCase Propel перекладає сам) */
$new_our_field = $category->getNewOurField();

/* Запис у полі */
$category->setNewOurField($new_our_field . '- additional text')
          ->save(); // Збереження основою