protected function buildJoins($val, $inner = FALSE) { $driver = $this->selection->getConnection()->getSupplementalDriver(); $reflection = $this->selection->getConnection()->getDatabaseReflection(); $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 = $this->selection->getName(); 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) = $reflection->getHasManyReference($parent, $name); $column = $reflection->getPrimary($parent); } else { list($table, $column) = $reflection->getBelongsToReference($parent, $name); $primary = $reflection->getPrimary($table); } $joins[$name] = ' ' . (!isset($joins[$name]) && $inner && !isset($match[3]) ? 'INNER' : 'LEFT') . ' JOIN ' . $driver->delimite($table) . ($table !== $name ? ' AS ' . $driver->delimite($name) : '') . ' ON ' . $driver->delimite($parent) . '.' . $driver->delimite($column) . ' = ' . $driver->delimite($name) . '.' . $driver->delimite($primary); $parent = $name; } } } return $joins; }
public function &__get($key) { $this->access($key); if (array_key_exists($key, $this->data)) { return $this->data[$key]; } list($table, $column) = $this->table->getConnection()->getDatabaseReflection()->getBelongsToReference($this->table->getName(), $key); $referenced = $this->getReference($table, $column); if ($referenced !== FALSE) { $this->access($key, FALSE); return $referenced; } $this->access($key, NULL); throw new MemberAccessException("Cannot read an undeclared column \"{$key}\"."); }