addPackage() и 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 из другой модели, буду рада помощи.
pandaworks
20 мая 2025, 11:53
modx.pro
526
0

Комментарии: 4

Наумов Алексей
20 мая 2025, 12:48
0
В select вот эта цепочка modTemplateVarResource.preview.value выглядит длинновато. Без modTemplateVarResource попробуйте.
    pandaworks
    20 мая 2025, 13:21
    0
    Да, я так тоже пробовала. Собственно, без подключения goodStar я сразу писала event_city.value. Но, как только подключила рейтинг, так уже тоже не сработало.
    Артур Шевченко
    20 мая 2025, 21:22
    +1
    Обычно для компонентов не требуется указывать префикс таблиц в методе addPackage().
    И кажется ты не понимаешь что это за магические письмена
    $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();
      pandaworks
      21 мая 2025, 08:49
      0
      Бинго!
      Так-то я знаю, что в leftJoin указываются соответствия строк таблиц, но что после объявления псевдонима дальше используется только он — это я забыла. Спасибо!
      Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
      4