<![CDATA[ xPDO Retrieving joined rows out of many-to-many tables - My Forums]]> https://forums.modx.com/thread/?thread=32455 <![CDATA[Re: xPDO Retrieving joined rows out of many-to-many tables]]> https://forums.modx.com/thread/32455/xpdo-retrieving-joined-rows-out-of-many-to-many-tables?page=2#dis-post-420889 fadliawan Apr 20, 2012, 05:11 AM https://forums.modx.com/thread/32455/xpdo-retrieving-joined-rows-out-of-many-to-many-tables?page=2#dis-post-420889 <![CDATA[Re: xPDO Retrieving joined rows out of many-to-many tables]]> https://forums.modx.com/thread/32455/xpdo-retrieving-joined-rows-out-of-many-to-many-tables#dis-post-177417 Quote from: OpenGeek at Oct 08, 2009, 04:57 PM

You can’t return data like that as a collection of objects with getCollection.

I don’t actually understand what does it mean ’data like that’. What is the difference between code Shaun’s given and which returned results:
$c = $modx->newQuery('klimaFirmy');
$c->select('
     klimaFirmy.*,
     (SELECT GROUP_CONCAT(region) FROM '.$modx->getTableName('klimaRegion').' ORDER BY region ASC ) AS regiony
');
$c->leftJoin('klimaFirmaRegion','FirmaRegion');
$c->leftJoin('klimaRegion','Region','Region.id = FirmaRegion.region');
$c->where(array(
    'klimaFirma.nazwa:LIKE' => '%ma%',
));
$c->sortby('klimaFirmy.id','ASC');
$c->groupby('klimaFirmy.id');
$collection = $modx->getCollection('klimaFirmy',$c);


and my code:

$c = $modx->newQuery('klimaFirma');
$c->select('
	 GROUP_CONCAT 
	 ( Region.region ORDER BY Region.region ASC )
	 regiony, klimaFirma.*
');
$c->leftJoin('klimaFirmaRegion','FirmaRegion');
$c->leftJoin('klimaRegion','Region','Region.id = FirmaRegion.region');
$c->where(array(
	'klimaFirma.nazwa:LIKE' => '%ma%',
));
$c->sortby('klimaFirma.id','ASC');
$c->groupby('klimaFirma.id');


$firmy = $modx->getCollection('klimaFirma', $c);

foreach ($firmy as $firma) {
	print('<br/>'.$firma->get('nazwa').' '.$firma->get('regiony'));
}

echo 'Wszystkie firmy: '.count($firmy);
]]>
maciej.m Oct 08, 2009, 12:31 PM https://forums.modx.com/thread/32455/xpdo-retrieving-joined-rows-out-of-many-to-many-tables#dis-post-177417
<![CDATA[Re: xPDO Retrieving joined rows out of many-to-many tables]]> https://forums.modx.com/thread/32455/xpdo-retrieving-joined-rows-out-of-many-to-many-tables#dis-post-177416 opengeek Oct 08, 2009, 11:57 AM https://forums.modx.com/thread/32455/xpdo-retrieving-joined-rows-out-of-many-to-many-tables#dis-post-177416 <![CDATA[Re: xPDO Retrieving joined rows out of many-to-many tables]]> https://forums.modx.com/thread/32455/xpdo-retrieving-joined-rows-out-of-many-to-many-tables#dis-post-177415 I use toSQL() function to debug. Then I cut-n-paste SQL query to PhpMyAdmin.
This returns results in PhpMyAdmin but not on a webpage.

$c = $modx->newQuery('klimaFirma');
$c->select('
	 GROUP_CONCAT 
	 ( Region.region ORDER BY Region.region ASC )
	 regiony, klimaFirma.*
');
$c->leftJoin('klimaFirmaRegion','FirmaRegion');
$c->leftJoin('klimaRegion','Region','Region.id = FirmaRegion.region');
$c->where(array(
	'klimaFirma.nazwa:LIKE' => '%ma%',
));
$c->sortby('klimaFirma.id','ASC');
$c->groupby('klimaFirma.id');


$c->prepare();
$sql = $c->toSQL();

echo $sql; // Printing SQL statement which I then try in PhpMyAdmin

$firmy = $modx->getCollection('klimaFirma', $c);

foreach ($firmy as $firma) {
	print('<br/>'.$firma->get('nazwa').' '.$firma->get('regiony'));
}

echo 'Wszystkie firmy: '.count($firmy)
;]]>
maciej.m Oct 08, 2009, 11:40 AM https://forums.modx.com/thread/32455/xpdo-retrieving-joined-rows-out-of-many-to-many-tables#dis-post-177415
<![CDATA[Re: xPDO Retrieving joined rows out of many-to-many tables]]> https://forums.modx.com/thread/32455/xpdo-retrieving-joined-rows-out-of-many-to-many-tables#dis-post-177414
DEBUG:
SELECT klimaFirma.*, (SELECT GROUP_CONCAT(region) FROM `modx_klima_regiony` ORDER BY region ASC SEPARATOR ";;;" ) AS regiony FROM `modx_klima_firmy` AS `klimaFirma` LEFT JOIN `modx_klima_firma_region` `FirmaRegion` ON `klimaFirma`.`id` = `FirmaRegion`.`firma` LEFT JOIN `modx_klima_regiony` `Region` ON Region.id = FirmaRegion.region WHERE `klimaFirma`.`nazwa` LIKE '%ma%' GROUP BY klimaFirma.id ORDER BY klimaFirma.id ASC


I’ve also noticed that two of the following are not equivalent (at least they don’t return similar results)

SELECT * FROM `modx_klima_firmy` 
LEFT JOIN `modx_klima_firma_region` 
ON (modx_klima_firmy.id = modx_klima_firma_region.firma) 
LEFT JOIN `modx_klima_regiony` 
ON (modx_klima_regiony.id = modx_klima_firma_region.region);


AND

$query = $modx->newQuery('klimaFirma');
$query->select('klimaFirma.*, Region.region AS region, Region.id AS reg_id');
$query->leftJoin('klimaFirmaRegion','FirmaRegion', 'klimaFirma.id = FirmaRegion.firma');
$query->leftJoin('klimaRegion','Region','Region.id = FirmaRegion.region');


The first returns duplicated data (for each Region Firma has)
The second doesn’t.]]>
maciej.m Oct 08, 2009, 10:00 AM https://forums.modx.com/thread/32455/xpdo-retrieving-joined-rows-out-of-many-to-many-tables#dis-post-177414
<![CDATA[Re: xPDO Retrieving joined rows out of many-to-many tables]]> https://forums.modx.com/thread/32455/xpdo-retrieving-joined-rows-out-of-many-to-many-tables#dis-post-177413 Quote from: maciej.m at Oct 08, 2009, 11:55 AM

Now I have such ’complex’ (?) query as:

SELECT GROUP_CONCAT( modx_klima_regiony.region
ORDER BY modx_klima_regiony.region ASC 
SEPARATOR  ';;;' ) regiony, modx_klima_firmy. * 
FROM modx_klima_firmy
LEFT JOIN modx_klima_firma_region ON ( modx_klima_firmy.id = modx_klima_firma_region.firma ) 
LEFT JOIN modx_klima_regiony ON ( modx_klima_regiony.id = modx_klima_firma_region.region ) 
WHERE modx_klima_firmy.nazwa LIKE '%ma%'
GROUP BY modx_klima_firmy.id
ORDER BY modx_klima_firmy.nazwa ASC 


$c = $modx->newQuery('klimaFirmy');
$c->select('
     klimaFirmy.*,
     (SELECT GROUP_CONCAT(region) FROM '.$modx->getTableName('klimaRegion').' ORDER BY region ASC SEPARATOR  ";;;" ) AS regiony
');
$c->leftJoin('klimaFirmaRegion','FirmaRegion');
$c->leftJoin('klimaRegion','Region','Region.id = FirmaRegion.region');
$c->where(array(
    'klimaFirma.nazwa:LIKE' => '%ma%',
));
$c->sortby('klimaFirmy.id','ASC');
$c->groupby('klimaFirmy.id');
$collection = $modx->getCollection('klimaFirmy',$c);


or something like that.

I strongly recommend reading thoroughly the xPDO docs and the API docs.
]]>
splittingred Oct 08, 2009, 09:01 AM https://forums.modx.com/thread/32455/xpdo-retrieving-joined-rows-out-of-many-to-many-tables#dis-post-177413
<![CDATA[Re: xPDO Retrieving joined rows out of many-to-many tables]]> https://forums.modx.com/thread/32455/xpdo-retrieving-joined-rows-out-of-many-to-many-tables#dis-post-177412
SELECT GROUP_CONCAT( modx_klima_regiony.region
ORDER BY modx_klima_regiony.region ASC 
SEPARATOR  ';;;' ) regiony, modx_klima_firmy. * 
FROM modx_klima_firmy
LEFT JOIN modx_klima_firma_region ON ( modx_klima_firmy.id = modx_klima_firma_region.firma ) 
LEFT JOIN modx_klima_regiony ON ( modx_klima_regiony.id = modx_klima_firma_region.region ) 
WHERE modx_klima_firmy.nazwa LIKE '%ma%'
GROUP BY modx_klima_firmy.id
ORDER BY modx_klima_firmy.nazwa ASC 


I’m not sure how to translate it into xPDO

--
Regards
MM]]>
maciej.m Oct 08, 2009, 06:55 AM https://forums.modx.com/thread/32455/xpdo-retrieving-joined-rows-out-of-many-to-many-tables#dis-post-177412
<![CDATA[Re: xPDO Retrieving joined rows out of many-to-many tables]]> https://forums.modx.com/thread/32455/xpdo-retrieving-joined-rows-out-of-many-to-many-tables#dis-post-177411
Though I still don’t understand this line:
$query->leftJoin(’klimaRegion’,’Region’,’FirmaRegion.region = Region.id’);

You’re just specifying the criteria manually for the JOIN. You’re saying, only JOIN if FirmaRegion’s region field is equal to the JOINed table’s ID field.


In return: Id like to report a mistake in xPDO documentation:
http://svn.modxcms.com/docs/display/XPDO10/xPDOQuery
In example -> $c->sortby - should be $query->sortby (and following lines)
Am I right?
You are; it’s been corrected. Thanks!]]>
maciej.m Oct 07, 2009, 10:05 AM https://forums.modx.com/thread/32455/xpdo-retrieving-joined-rows-out-of-many-to-many-tables#dis-post-177411
<![CDATA[Re: xPDO Retrieving joined rows out of many-to-many tables]]> https://forums.modx.com/thread/32455/xpdo-retrieving-joined-rows-out-of-many-to-many-tables#dis-post-177410
$query = $modx->newQuery('klimaFirma');
$query->select('klimaFirma.*, Region.region AS region');
$query->leftJoin('klimaFirmaRegion','FirmaRegion');
$query->leftJoin('klimaRegion','Region','FirmaRegion.region = Region.id');

$firmy = $modx->getCollection('klimaFirma', $query);
foreach ($firmy as $firma) {
	echo '<br />'.$firma->get('nazwa').' '.$firma->get('region');
}
]]>
splittingred Oct 07, 2009, 09:45 AM https://forums.modx.com/thread/32455/xpdo-retrieving-joined-rows-out-of-many-to-many-tables#dis-post-177410
<![CDATA[Re: xPDO Retrieving joined rows out of many-to-many tables]]> https://forums.modx.com/thread/32455/xpdo-retrieving-joined-rows-out-of-many-to-many-tables#dis-post-177409 splittingred Oct 07, 2009, 09:42 AM https://forums.modx.com/thread/32455/xpdo-retrieving-joined-rows-out-of-many-to-many-tables#dis-post-177409