addPackage() и leftJoin
Здравствуйте.
Для кастомного фильтра написала выборку из таблиц в файле для аякс-запросов. Обычный mFilter2 не подошел, использовать pdoResources тоже не стала, так как там получается многовато условий в where. Использовала просто xpdo. Пока джойнила таблицы из родной модели модкса, все работало. Но тут понадобилось вывести рейтинг goodStar. Получилось примерно так (без учета всех условий where, где рейтинг не участвует):
Одним словом, если кто-нибудь знает, как правильно написать leftJoin из другой модели, буду рада помощи.
Для кастомного фильтра написала выборку из таблиц в файле для аякс-запросов. Обычный mFilter2 не подошел, использовать pdoResources тоже не стала, так как там получается многовато условий в where. Использовала просто xpdo. Пока джойнила таблицы из родной модели модкса, все работало. Но тут понадобилось вывести рейтинг goodStar. Получилось примерно так (без учета всех условий where, где рейтинг не участвует):
$pdoTools = $modx->getService('pdoTools');
$goodStar = $modx->addPackage('goodstar', MODX_CORE_PATH . 'components/goodstar/model/', null);
$q = $modx->newQuery('modResource');
$q->leftJoin('modTemplateVarResource', 'event_city', 'modResource.id = event_city.contentid AND event_city.tmplvarid = 79');
$q->leftJoin('modTemplateVarResource', 'event_date', 'modResource.id = event_date.contentid AND event_date.tmplvarid = 46');
$q->leftJoin('modTemplateVarResource', 'event_date_end', 'modResource.id = event_date_end.contentid AND event_date_end.tmplvarid = 51');
$q->leftJoin('modTemplateVarResource', 'preview', 'modResource.id = preview.contentid AND preview.tmplvarid = 21');
$q->leftJoin('goodStarVoteCount', 'countaverage', 'modResource.id = goodStarVoteCount.thread');
$where = array(
'modResource.published' => 1,
'modResource.deleted' => 0
);
// ... и еще куча условий
$q->where($where);
$q->sortby('event_date.value','ASC');
$q->select(array(
'modResource.id as id',
'modResource.pagetitle as pagetitle',
'modTemplateVarResource.preview.value as preview',
'modTemplateVarResource.event_date.value as event_date',
'modTemplateVarResource.event_date_end.value as event_date_end',
'modTemplateVarResource.event_city.value as event_city',
'goodStarVoteCount.countaverage as countaverage'
));
$q->prepare();
$q->stmt->execute();
$events = $q->stmt->fetchAll(PDO::FETCH_ASSOC);
...
В addPackage null убирала, обычный префикс таблиц модкса тоже ставила. MODX_CORE_PATH тоже видна. Судя по отладке, goodstar подключается. Но результат выборки в итоге — пустой массив. Судя по всему, я что-то не так написала в строках с leftJoin или select для goodstar. Такое ощущение, что фетч не понимает, что эти данные нужно брать из подключенной модели.Одним словом, если кто-нибудь знает, как правильно написать leftJoin из другой модели, буду рада помощи.
Комментарии: 4
В select вот эта цепочка modTemplateVarResource.preview.value выглядит длинновато. Без modTemplateVarResource попробуйте.
Да, я так тоже пробовала. Собственно, без подключения goodStar я сразу писала event_city.value. Но, как только подключила рейтинг, так уже тоже не сработало.
Обычно для компонентов не требуется указывать префикс таблиц в методе addPackage().
И кажется ты не понимаешь что это за магические письмена
На чистом SQL запрос будет примерно таким
И кажется ты не понимаешь что это за магические письмена
$q->leftJoin('goodStarVoteCount', 'countaverage', 'modResource.id = countaverage.thread');
Первым аргументом в метод leftJoin передаётся имя класса ('goodStarVoteCount'); вторым псевдоним для таблицы ( 'countaverage'), если не передать будет взято имя класса; третьим аргументом передаётся условие соединение таблиц как в операторе ON в SQL ( 'modResource.id = countaverage.thread').На чистом SQL запрос будет примерно таким
SELCET `modResource`.`id` as `id`, `countaverage`.`countaverage` as `count` FROM `modx_site_content` as `modResource`
LEFT JOIN `modx_good_stars_vote_count` as `countaverage` ON `modResource`.`id` = `countaverage`.`thread`
WHERE `modResource`.`published` = 1 AND `modResource`.`deleted` = 0
Как видишь в секциях SELECT и ON используется псевдоним таблицы, в xPDO тоже надо использовать псевдонимы, если они указаны в leftJoin или setTableAlias. Поэтому вот это всё 'modTemplateVarResource.preview.value as preview',
'modTemplateVarResource.event_date.value as event_date',
'modTemplateVarResource.event_date_end.value as event_date_end',
'modTemplateVarResource.event_city.value as event_city',
'goodStarVoteCount.countaverage as countaverage'
неверно, должно быть так'preview.value as preview',
'event_date.value as event_date',
'event_date_end.value as event_date_end',
'event_city.value as event_city',
'countaverage as countaverage'
И наконец, чтобы проверить какой же запрос будет выполнен можно сделать так$q->prepare();
echo $q->toSQL();
Бинго!
Так-то я знаю, что в leftJoin указываются соответствия строк таблиц, но что после объявления псевдонима дальше используется только он — это я забыла. Спасибо!
Так-то я знаю, что в leftJoin указываются соответствия строк таблиц, но что после объявления псевдонима дальше используется только он — это я забыла. Спасибо!
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.