Выборка из нескольких таблиц в MODx Revo

#разработка, #MODx, #MODx Revo, #migx, #pdoTools
Выборка из нескольких таблиц в MODx Revo

Часто в быту разработки под MODx Revo хочется без написания своего сниппета вывести содержимое произвольной таблицы. Под это дело хорошо заточены сниппеты двух дополнений MODx Revo:

  • pdoResources (дополнение pdoTools)
  • migxLoopCollection (дополнение MIGX)

Оба этих сниппета позволяют подключать пакеты для работы с произвольными таблицами. И они оба позволяют ограничить выборку полей из таблицы (что очень важно при работе с большими объёмами данных).

Задача

Давайте рассмотрим вариант, когда сниппет перебора должен отработать на большом количестве записей и данные нужно брать из нескольких таблиц, одна из которых не является стандратной таблицей базы MODX, мы её создали сами (в данном случае для хранения товара).

Выборка из двух таблиц через pdoResources через join

Конечно выборка из двух таблиц в базе данных осуществляется с использованием операторов join. И следовательно в документации к сниппетам надо искать одноименные параметры. В документации к pdoResources вы не найдете их упоминания :) Но они есть! Чтобы враг не догадался, упоминание о существовании этих параметров есть в разделе Общих параметров для сниппетов, основанных на pdoTools/pdoFetch.

В рассматриваемом примере нам надо склеить псевдоним товара с частью урла родительской категории. Товар у нас лежит в произвольной таблице базы данных, описание модели которой находится в пакете "shop", имя класса для работы с xPDO - ShopContent. При помощи INNER JOIN нам нужно вытянуть uri поле из обычной таблицы с ресурсами MODx (site_content c классом modResource). Первичная выборка идет по ShopContent, мы должны указать её реквизиты через два параметра:

  • &class - класс для рабоыт с нашей таблицей (у нас это `ShopContent`)
  • &loadModels - имя пакета, в котором хранится класс и схема для таблицы (в примере это `shop`)

Через параметр &innerJoin мы подсоединяем таблицу с ресурсами MODx. Для удобства задаем ей тематический псевдоним для нашей предметной области, у нас это машины - car.

Параметр &select указывать не обязательно. Но желательно всегда ограничивать им количество выбираемых полей для работы (так вы сэкономите используемую скриптом память и сократите время его исполнения). В нашем примере нам нужно было поле alias от таблицы ShopContent и поле uri от таблицы modResource.

Использование pdoResources для выборки из двух таблиц

[[pdoResources?
    &parents=`0`
    &tpl=`tpl_sitemap_product`
    &limit=`0`
    &where=`{"published:=":"1","deleted:=":"0"}`
    &class=`ShopContent`
    &loadModels=`shop`
    &fastMode=`1`
    &innerJoin=`{
    	"car": {
    		"class":"modResource"
    		,"alias":"car"
    		,"on": "car.id = ShopContent.resource_id"
    	}
    }`
    &select=`{
    	"ShopContent":"alias"
    	,"car":"car.uri as uri"
    }`
]]

Аналогичные параметры для migxLoopCollection

  • &joins - подключение доп. таблиц в выборку ( `[{"alias":"car", "classname":"modResource", "on":"ShopContent.resource_id=car.id"}]` )
  • &selectfields - ограничеваем список полей для работы (`alias,car.uri`)

Если что-то не понятно - смело задавайте вопросы в комментариях к посту.

Количество просмотров: 1 631

Поделиться в соцсетях:

Статьи по теме