protected function buildJoins($val, $inner = FALSE) { $joins = array(); preg_match_all('~\\b([a-z][\\w.:]*[.:])([a-z]\\w*|\*)(\\s+IS\\b|\\s*<=>)?~i', $val, $matches); foreach ($matches[1] as $names) { $parent = $parentAlias = $this->tableName; if ($names !== "$parent.") { // case-sensitive preg_match_all('~\\b([a-z][\\w]*|\*)([.:])~i', $names, $matches, PREG_SET_ORDER); foreach ($matches as $match) { list(, $name, $delimiter) = $match; if ($delimiter === ':') { list($table, $primary) = $this->databaseReflection->getHasManyReference($parent, $name); $column = $this->databaseReflection->getPrimary($parent); } else { list($table, $column) = $this->databaseReflection->getBelongsToReference($parent, $name); $primary = $this->databaseReflection->getPrimary($table); } $joins[$name] = ' ' . (!isset($joins[$name]) && $inner && !isset($match[3]) ? 'INNER' : 'LEFT') . ' JOIN ' . $this->driver->delimite($table) . ($table !== $name ? ' AS ' . $this->driver->delimite($name) : '') . ' ON ' . $this->driver->delimite($parentAlias) . '.' . $this->driver->delimite($column) . ' = ' . $this->driver->delimite($name) . '.' . $this->driver->delimite($primary); $parent = $table; $parentAlias = $name; } } } return $joins; }
/** * Sets database reflection * @param IReflection database reflection object * @return NConnection provides a fluent interface */ public function setDatabaseReflection(IReflection $databaseReflection) { $databaseReflection->setConnection($this); $this->databaseReflection = $databaseReflection; return $this; }