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; }
protected function getReference($table, $column) { if (array_key_exists($column, $this->data)) { $this->access($column); $value = $this->data[$column]; $value = $value instanceof TableRow ? $value->getPrimary() : $value; $referenced = $this->table->getReferencedTable($table, $column, !empty($this->modified[$column])); $referenced = isset($referenced[$value]) ? $referenced[$value] : NULL; // referenced row may not exist if (!empty($this->modified[$column])) { // cause saving changed column and prevent regenerating referenced table for $column $this->modified[$column] = 0; // 0 fails on empty, pass on isset } return $referenced; } return FALSE; }
public function delete() { $builder = $this->sqlBuilder; $this->sqlBuilder = new SqlBuilder($this); $this->where($this->column, $this->active); $return = parent::delete(); $this->sqlBuilder = $builder; return $return; }