/** * Get count of data * @return int */ public function getCount() { try { $primary = $this->data_source->getPrimary(); } catch (\LogicException $e) { return $this->data_source->count('*'); } return $this->data_source->count($this->data_source->getName() . '.' . (is_array($primary) ? reset($primary) : $primary)); }
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; }
/** * Returns referencing rows. * @param string * @param string * @return GroupedSelection */ public function related($key, $throughColumn = NULL) { $groupedSelection = $this->table->getReferencingTable($key, $throughColumn, $this[$this->table->getPrimary()]); if (!$groupedSelection) { throw new Nette\MemberAccessException("No reference found for \${$this->table->getName()}->related({$key})."); } return $groupedSelection; }
/** * Returns specified row. * * @param mixed $key Row's primary key * @return HyperRow|NULL if there is no such row */ public function offsetGet($key) { $result = $this->selection->offsetGet($key); if ($result instanceof ActiveRow) { return $this->factory->createRow($result, $this->selection->getName()); } return $result; }
public function __isset($key) { $this->access($key); if (array_key_exists($key, $this->data)) { return isset($this->data[$key]); } list($table, $column) = $this->table->getConnection()->getDatabaseReflection()->getBelongsToReference($this->table->getName(), $key); $referenced = $this->getReference($table, $column); if (!isset($referenced)) { $this->access($key, TRUE); return FALSE; } return TRUE; }
public function &__get($key) { $this->access($key); if (array_key_exists($key, $this->data)) { return $this->data[$key]; } $this->access($key, TRUE); list($table, $column) = $this->table->getConnection()->getDatabaseReflection()->getBelongsToReference($this->table->getName(), $key); $referenced = $this->getReference($table, $column); if ($referenced !== FALSE) { return $referenced; } throw new Nette\MemberAccessException("Cannot read an undeclared column \"{$key}\"."); }
public function &__get($key) { $this->accessColumn($key); if (array_key_exists($key, $this->data)) { return $this->data[$key]; } try { list($table, $column) = $this->table->getDatabaseReflection()->getBelongsToReference($this->table->getName(), $key); $referenced = $this->getReference($table, $column); if ($referenced !== FALSE) { $this->accessColumn($key, FALSE); return $referenced; } } catch (MissingReferenceException $e) { } $this->removeAccessColumn($key); throw new Nette\MemberAccessException("Cannot read an undeclared column \"{$key}\"."); }
/** * @param Selection $selection * @return HyperSelection */ public function createSelection(Selection $selection) { $tableName = $selection->getName(); $className = Helpers::substituteClassWildcard($this->selectionMapping, $tableName); $baseClass = HyperSelection::class; if (!class_exists($className) || !is_subclass_of($className, $baseClass)) { throw new InvalidStateException("HyperSelection class {$className} does not exist or does not extend {$baseClass}."); } $names = $this->container->findByType($className); if (count($names) > 1) { throw new InvalidStateException("Multiple services of type {$className} found: " . implode(', ', $names) . '.'); } elseif (count($names) == 0) { $inst = $this->container->createInstance($className); } else { $name = array_shift($names); $inst = $this->container->createService($name); } /** @var HyperSelection $inst */ $inst->setFactory($this); $inst->setSelection($selection); return $inst; }
/** * Creates a new row. * @param mixed[] * @param \Nette\Database\Table\Selection * @return \Nette\Database\Table\ActiveRow */ public function createRow(array $data, \Nette\Database\Table\Selection $table) { $class = $this->getRowClass($table->getName()); return new $class($data, $table); }