Ограничение по дополнительному свойству выборки элементов контроллером
Чтобы добавить дополнительные ограничения по основным или доп. св-вам, у контроллера показа ИС необходимо получить объект информационных элементов и добавить к нему доп. ограничения через QueryBuilder.
Объект получаем через $Informationsystem_Controller_Show->informationsystemItems(), это уже объект ORM (Core_Entity), у которого можно получить ->queryBuilder() и далее добавлять ограничения.
// Объединение с нужной таблицей свойств
$Informationsystem_Controller_Show
->informationsystemItems()
->queryBuilder()
->leftJoin('informationsystem_item_properties', 'informationsystem_items.informationsystem_id', '=', 'informationsystem_item_properties.informationsystem_id')
->leftJoin('property_value_ints', 'informationsystem_items.id', '=', 'property_value_ints.entity_id',
array(
array('AND' => array('informationsystem_item_properties.property_id', '=', Core_QueryBuilder::expression('`property_value_ints`.`property_id`')))
)
)
// Идентификатор дополнительного свойства
->where('informationsystem_item_properties.property_id', '=', 19)
// Значание дополнительного свойства
->where('property_value_ints.value', '=', '123')
->groupBy('informationsystem_items.id')
// Количество свойств
->having(Core_Querybuilder::expression('COUNT(DISTINCT `informationsystem_item_properties`.`property_id`)'), '=', 1)
;
$Informationsystem_Controller_Show->show();
Обратите внимание, что сейчас значения всех доп. свойств хранятся в 5 разных таблицах:
property_value_datetimes для даты и даты-времени
property_value_files для файлов
property_value_ints для целых чисел
property_value_strings для строк
property_value_texts для текстов
В примере дано ограничение и объединение по числам, если используются другие таблицы, их аналогичным образом необходимо подключить.
Сортировка по дополнительному свойству товара
Пример сортировки по целочисленному значению дополнительного св-ва с кодом 63
toasterec,
да, теперь св-ва хранятся в 5 разных таблицах с соответствующим типом поля, отсюда преимущество, например, значения св-ва число сортируются как числа, а не как строки
Как теперь передаются дополнительные параметры в xslt-шаблон?
(по аналогии со старым $external_propertys),
в коде Informationsystem_Controller_Show никаких намеков на это
toasterec,
да, теперь св-ва хранятся в 5 разных таблицах с соответствующим типом поля, отсюда преимущество, например, значения св-ва число сортируются как числа, а не как строки
вот денормализация это хорошо!
но зачем было мешать в кучу свойства магазина, информационной системы, структуры?
не является ли данное решение "топтанием на месте"?
Недальновидно, наше решение позволяет создавать композицию элементов и строить иерархический XML.
toasterec писал(а):
вот денормализация это хорошо!
но зачем было мешать в кучу свойства магазина, информационной системы, структуры?
не является ли данное решение «топтанием на месте»?
Не соглашусь, этот вопрос был очень хорошо проработан.
Данное решение позволило:
1. Уменьшить в разы код, сделать универсальные контроллеры для ЦА и работы со свойствами. Работа со свойствами потребует дополнительных примеров, мы разместим их в отдельной теме.
2. Сделать доступными все типы дополнительных свойств для ИС, магазина, пользователей.
Аналогично мы поступили и с комментариями, это позволило в магазине реализовывать иерархию комментариев, в пятой версии этой возможности не было.
Недальновидно, наше решение позволяет создавать композицию элементов и строить иерархический XML.
не вижу противоречий, т.к. не предлагаю убрать addaddEntity
а лишь расширить его дополнительной функцией,
аналогично можно поступить с условиями ограничения выборки по дополнительным свойствам.
В лоб не смог придумать как расширить класс, например Informationsystem_Controller_Show, так чтобы в основной код системы не вносить изменения