xPDO.getCollectionGraph
Последнее обновление Apr 20th, 2021 | История страницы | Улучшить эту страницу | Сообщить о проблеме
Support the team building MODX with a monthly donation.
The budget raised through OpenCollective is transparent, including payouts, and any contributor can apply to be paid for their work on MODX.
Backers
Budget
$301 per month—let's make that $500!
Learn morexPDO::getCollectionGraph¶
Извлекает коллекцию xPDOObjects
и связанных объектов по указанномуxPDOCriteria
.
Если ничего не найдено, возвращает пустой массив.
Синтаксис¶
API Docs: https://api.modx.com/revolution/2.2/db_core_xpdo_xpdo.class.html#\xPDO::getCollectionGraph()
array getCollectionGraph (string $className, array|str $graph, [xPDOCriteria|array|str|int $criteria = null], [bool|int $cacheFlag = true])
Помните, что если вы используете карту xPDO и файлы классов, которые были сгенерированы из схемы XML, имя класса не совпадает с именем вашей таблицы. Если сомневаетесь, взгляните на XML-файл схемы, например,
<object class="MyClassName" table="my_class_name" extends="xPDOObject">
Пример¶
Получите коллекцию объектов Box со связанными объектами BoxColors и Color, где Box имеет ширину 40.
$boxes = $xpdo->getCollectionGraph('Box', '{"BoxColors":{"Color":{}}}', array('Box.width' => 40));
foreach ($boxes as $box) {
foreach ($box->getMany('BoxColors') as $boxColor) {
echo "A box with width of 40 and a color of " . $boxColor->getOne('Color')->get('name') . " was found.\n";
}
}
Нет дополнительных запросов
Основным преимуществом использования getCollectionGraph является получение данных из связанных таблиц в одном запросе. Никакие дополнительные запросы не выполняются, когда getMany()
или getOne()
вызываются для связанных объектов, которые уже загружены из $graph
. Графики являются полезной альтернативой использованию соединений xPDO.
Отладка¶
При использовании getCollectionGraph
необходимо учитывать несколько предостережений. Вы не можете использовать традиционные методы "prepare" и "toSQL". Рассмотрим следующий код:
$criteria['modResource.id:IN'] = array(1,2,3);
$criteria['TemplateVarResources.tmplvarid'] = 5;
$criteria = $modx->newQuery('modResource', $criteria);
$criteria->prepare();
print $criteria->toSQL();
$pages = $modx->getCollectionGraph('modResource', '{"TemplateVarResources":{"TemplateVar":{}}}', $criteria);
Если вы посмотрите на запрос, то увидите, что в объекте $critree
, который указывает JOIN, нет ничего присущего. Вы указываете столбцы в нескольких таблицах (modResource
и TemplateVarResources
), но если вы посмотрите на запрос при использовании метода toSQL()
, вы обнаружите, что запрос не будет выполнен.
Объединение связанных таблиц происходит в этом случае, когда выполняется функция getCollectionGraph()
, поэтому попытка распечатать SQL до этого момента не даст точного результата.
Смотрите также¶
Support the team building MODX with a monthly donation.
The budget raised through OpenCollective is transparent, including payouts, and any contributor can apply to be paid for their work on MODX.
Backers
Budget
$301 per month—let's make that $500!
Learn more