/** * Inserts row in a table. * @param array|\Traversable|Selection array($column => $value)|\Traversable|Selection for INSERT ... SELECT * @return IRow|int|bool Returns IRow or number of affected rows for Selection or table without primary key */ public function insert($data) { if ($data instanceof self) { $data = new Nette\Database\SqlLiteral($data->getSql(), $data->getSqlBuilder()->getParameters()); } elseif ($data instanceof \Traversable) { $data = iterator_to_array($data); } $return = $this->connection->query($this->sqlBuilder->buildInsertQuery(), $data); $this->loadRefCache(); if ($data instanceof Nette\Database\SqlLiteral || $this->primary === NULL) { unset($this->refCache['referencing'][$this->getGeneralCacheKey()][$this->getSpecificCacheKey()]); return $return->getRowCount(); } $primaryKey = $this->connection->getInsertId($this->getPrimarySequence()); if ($primaryKey === FALSE) { unset($this->refCache['referencing'][$this->getGeneralCacheKey()][$this->getSpecificCacheKey()]); return $return->getRowCount(); } if (is_array($this->getPrimary())) { $primaryKey = array(); foreach ((array) $this->getPrimary() as $key) { if (!isset($data[$key])) { return $data; } $primaryKey[$key] = $data[$key]; } if (count($primaryKey) === 1) { $primaryKey = reset($primaryKey); } } $row = $this->createSelectionInstance() ->select('*') ->wherePrimary($primaryKey) ->fetch(); if ($this->rows !== NULL) { if ($signature = $row->getSignature(FALSE)) { $this->rows[$signature] = $row; $this->data[$signature] = $row; } else { $this->rows[] = $row; $this->data[] = $row; } } return $row; }
/** * @param string sequence object * @return string */ public function getInsertId($name = NULL) { return $this->connection->getInsertId($name); }