public function queryRecordRelated($sourceType, $destType, $linkIDs, $addSql = '', $bindings = array())
{
$addSql = $this->glueSQLCondition($addSql, QueryWriter::C_GLUE_WHERE);
list($sourceTable, $destTable, $linkTable, $sourceCol, $destCol) = $this->getRelationalTablesAndColumns($sourceType, $destType);
$key = $this->getCacheKey(array($sourceType, $destType, implode(',', $linkIDs), $addSql, $bindings));
if ($this->flagUseCache && ($cached = $this->getCached($destType, $key))) {
return $cached;
}
$inClause = $this->getParametersForInClause($linkIDs, $bindings);
$sqlFilterStr = '';
if (count(self::$sqlFilters)) {
$sqlFilterStr = $this->getSQLFilterSnippet($destType);
}
if ($sourceType === $destType) {
$inClause2 = $this->getParametersForInClause($linkIDs, $bindings, count($bindings));
//for some databases
$sql = "\n\t\t\tSELECT\n\t\t\t\t{$destTable}.* {$sqlFilterStr} ,\n\t\t\t\tCOALESCE(\n\t\t\t\tNULLIF({$linkTable}.{$sourceCol}, {$destTable}.id),\n\t\t\t\tNULLIF({$linkTable}.{$destCol}, {$destTable}.id)) AS linked_by\n\t\t\tFROM {$linkTable}\n\t\t\tINNER JOIN {$destTable} ON\n\t\t\t( {$destTable}.id = {$linkTable}.{$destCol} AND {$linkTable}.{$sourceCol} IN ({$inClause}) ) OR\n\t\t\t( {$destTable}.id = {$linkTable}.{$sourceCol} AND {$linkTable}.{$destCol} IN ({$inClause2}) )\n\t\t\t{$addSql}\n\t\t\t-- keep-cache";
$linkIDs = array_merge($linkIDs, $linkIDs);
} else {
$sql = "\n\t\t\tSELECT\n\t\t\t\t{$destTable}.* {$sqlFilterStr},\n\t\t\t\t{$linkTable}.{$sourceCol} AS linked_by\n\t\t\tFROM {$linkTable}\n\t\t\tINNER JOIN {$destTable} ON\n\t\t\t( {$destTable}.id = {$linkTable}.{$destCol} AND {$linkTable}.{$sourceCol} IN ({$inClause}) )\n\t\t\t{$addSql}\n\t\t\t-- keep-cache";
}
$bindings = array_merge($linkIDs, $bindings);
$rows = $this->adapter->get($sql, $bindings);
$this->putResultInCache($destType, $key, $rows);
return $rows;
}