Подзапрос в left/right/innerJoin через xPDO

Всем привет!

Помогите, пожалуйста, запрос через xPDO собрать.

Вот, в общем довольно типичный запрос:
SELECT  `msDiscountCard`.`id`
        `msDiscountCard`.`uid`,
        `msDiscountCard`.`public`,
        `msDiscountCard`.`discount_id`,
        `msDiscountCard`.`amount`,
        `msDiscountCard`.`amount_used`,
        `msDiscountCardMember`.`user`
    FROM `modx_ms2_discount_card` AS `msDiscountCard`
    LEFT JOIN (
        SELECT `msDiscountCardMember`.`id`,
                `msDiscountCardMember`.`discount_card_id`,
                `msDiscountCardMember`.`user_id`,
                `msDiscountCardMember`.`owner_type`
            FROM `modx_ms2_discount_card_members` AS `msDiscountCardMember`
            WHERE `msDiscountCardMember`.`owner_type` = 'owner'
    ) AS `msDiscountCardMember`
    ON `msDiscountCardMember`.`discount_card_id` = `msDiscountCard`.`id`

Но как через xPDO в JOIN засунуть подзапрос?
В доках написано, что в leftJoin/rightJoin/innerJoin четвёртым параметром можно передавать xPDOQuery, что собственно я и сделал:
$query = $modx->newQuery('msDiscountCard');
$subquery = $modx->newQuery('msDiscountCardMember');
$subquery->select('msDiscountCardMember.*');
$subquery->where(array(
    'msDiscountCardMember.owner_type' => 'owner'
));
$query->select('msDiscountCard.*, msDiscountCardMember.*');
$query->leftJoin('msDiscountCardMember', 'msDiscountCardMember', 'msDiscountCard.id = msDiscountCardMember.discount_card_id', $subquery);
if ($query->prepare()) {
    echo $query->toSQL();
}
//$cards = $modx->getIterator('msDiscountCard', $query);

Но нужного результата это не принесло:
SELECT msDiscountCard.*,
        msDiscountCardMember.*
    FROM `modx_ms2_discount_card` AS `msDiscountCard`
    LEFT JOIN `modx_ms2_discount_card_members` `msDiscountCardMember`
    ON msDiscountCard.id = msDiscountCardMember.discount_card_id

Задавал этот вопрос на modx-форуме, но там тишина.

Вот сижу и туплю теперь :-(
Алексей Карташов
04 августа 2013, 07:37
modx.pro
2
5 639
0

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

Алексей Карташов
04 августа 2013, 14:00
1
0
Усё, вопрос решён.
Переделал запрос на такой:
SELECT  `msDiscountCard`.`id`,
		`msDiscountCard`.`uid`,
		`msDiscountCard`.`public`,
		`msDiscountCard`.`discount_id`,
		`msDiscountCard`.`amount`,
		`msDiscountCard`.`amount_used`,
		`msDiscountCardMember`.`user_id`,
		`msDiscountCardMember`.`owner_type`,
		`msDiscountCardMember`.`discount_card_id`
	FROM `modx_bunny_lovems2_discount_card` AS `msDiscountCard`
	LEFT JOIN `modx_bunny_lovems2_discount_card_members` AS `msDiscountCardMember`
	ON `msDiscountCardMember`.`discount_card_id` = (
		SELECT  `msDiscountCardMember`.`discount_card_id`
			FROM `modx_bunny_lovems2_discount_card_members` AS `msDiscountCardMember`
			WHERE `msDiscountCardMember`.`owner_type` = 'owner'
				AND `msDiscountCard`.`id` = `msDiscountCardMember`.`discount_card_id`
			LIMIT 1
	)

И собрал его на xPDO вот так:
$subquery = $modx->newQuery('msDiscountCardMember');
$subquery->select('`msDiscountCardMember`.`discount_card_id`');
$subquery->where(array(
	'`msDiscountCardMember`.`owner_type`' => 'owner',
	'`msDiscountCard`.`id` = `msDiscountCardMember`.`discount_card_id`'
));
$subquery->limit(1);
$query = $modx->newQuery('msDiscountCard');
$query->select('`msDiscountCard`.*, `msDiscountCardMember`.`user_id`');
if ($subquery->prepare()) {
	$query->leftJoin('msDiscountCardMember', 'msDiscountCardMember', array(
		'`msDiscountCardMember`.`discount_card_id` = ('. $subquery->toSQL() .')'
	));
}
    Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
    1