Подскажите, как правильно заджойнить таблицы через pdoResources

Привет, есть простая модель projects и класс categories. В табице класса хранятся только названия категорий.
id | name
Для ресурсов через TV сохраняются id категорий.

Нужно сделать выборку ресурсов, но включить в нее кроме id и названия категорий. Пробую как-то так:

$projects = $modx->runSnippet('pdoResources',array(
    'parents' => 4,
    'includeTVs' => 'projectCat',
    'loadModels' => 'projects',
    'leftJoin' => '{"ProjCats" : {"class" : "categories", "on" : "projectCat = ProjCats.id"}}',
    'return' => 'json',
    'showLog' => 1
));

Ну и конечно ничего не работает. Подскажите, пожалуйста, как должно быть правильно.
regonforum
22 ноября 2017, 14:27
modx.pro
3
2 539
0

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

Денис
22 ноября 2017, 19:47
2
+1
ТВ поля подключаются после join, так что придется подтянуть всю цепочку вручную:

$projects = $modx->runSnippet('pdoResources',array(
	'parents' => 4,
	'includeTVs' => 'projectCat',
	'loadModels' => 'projects',
	'leftJoin' => '{
		"TvFieldResource" : {
			"class" : "modTemplateVarResource", 
			"on" : "TvFieldResource.contentid = modResource.id" //Связываем тв поле с значением по полю id ресурса
		},
		"TvField" : {
			"class": "modTemplateVar",
			"on": "TvField.id = TvFieldResource.tmplvarid AND TvField.name = \"projectCat\"" //Это связь для тв поля по по имени, хотя можно его и не использовать, а указать в TvFieldResource сразу значение tmplvarid(id тв поля)
		},
		"ProjCats" : {
			"class" : "categories", 
			"on" : "TvFieldResource.value = ProjCats.id" //связываем значение тв поля с вашим классом
		}
	}',
	'select' => '{
		"modResource": "*", //подтягиваем поля ресурса
		"ProjCats": "ProjCats.id as category_id, ProjCats.name as category_name" //и поля вашего класса, создав им псевдонимы category_id и category_name
	}',
    'return' => 'json',
    'showLog' => 1
));

Не проверял, но должно работать.
    regonforum
    22 ноября 2017, 20:18
    0
    Да, все работает, спасибо!

    П.С. Там не leftJoin, а innerJoin должен быть, но то уже мелочи )
    Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
    2