Exemple #1
0
	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;
	}