Подсоединяем не объявленную таблицу в Propel или Join Custom Table Propel

На днях передо мной стала задача отсортировать выдачу продуктов по таблице, которая не описана в schema.xml. Приведу краткий пример схемы таблицы и структуры таблицы с позициями, по которой мне следовало отсортировать товары.

Упрощенная таблица товаров (объединил таблицу переводов с основной и урезал поля):

id (int) id товара
name (string) Имя
create_date (int) Дата

Схема этой таблицы (schema.xml):

<table name="shop_products" phpName="SProducts">
        <vendor type="mysql">
            <parameter name="Charset" value="utf8"/>
        </vendor>

        <column name="id" type="INTEGER" required="true" autoIncrement="true" primaryKey="true"/>        
        <column name="name" type="varchar" size="500" required="true"/>
        <column name="create_date" type="INTEGER"/>        
</table>

Дорпустим у нас есть привязка товаров к статьям, и у каждой статьи может встречаться один и тот же товар и у каждого товара может быть своя позиция в каждой статье.

Приведу пример таблицы статей и связи товаров (назовем таблицу link_page):

page_id (int) Id статьи (приведено для примера)
product_id (int) Id товара со схемы SProducts
position (int) Позиция в которой товар есть в статье

Вот есть позиция у каждого товара в статье, но в таблице товара нет связки, чтобы сделать join пропелом. По этому начинаем делать вот так:

SProductsQuery::create()                            
   ->addJoin('shop_products.id' , 'link_page.product_id', Criteria::INNER_JOIN)
   ->addAsColumn('position', 'link_page.position')
   ->where('page_link_product.page_id = ' . 'ID страницы товара')                            
   ->orderBy('position','ASC')                      
    ->find();

В моем случае полный путь к Criteria::INNER_JOIN является \Propel\Runtime\ActiveQuery\Criteria::INNER_JOIN.

SProductsQuery - сгенерированная модель по схеме, упрощенная для понимания и описанная выше.

Данный запрос даст возможность подключить не объявленную в моделях таблица в пропел запрос, чтобы не делать костылей и велосипедов для сортировки.

Пробуйте, разбирайтесь, в моем случае addJoin() позволил сэкономить время переписи и перегенерации схемы под нужды, тем самым не сильно отягощая страницу статьи, на которой присутствуют товары.

1796 0

Комментарии

Пока нет ни одного отзыва. Оставьте отзыв первым
Только авторизованные пользователи могут оставлять комментарии Вход

Похожие статьи

Создать и скачать CSV на PHP

Рассмотрим возможность быстрого создания CSV файла с автоматическим скачиванием файла. Рассмотрим формирование, разделители и header для возможности скачать файл.