primaryKeyField = $primaryKeyField; $this->sequenceName = $sequenceName; } /** * @param Insert $insert */ public function preInsert(Insert $insert) { $columns = $insert->getRawState('columns'); $values = $insert->getRawState('values'); $key = array_search($this->primaryKeyField, $columns); if ($key !== false) { $this->sequenceValue = $values[$key]; return $insert; } $this->sequenceValue = $this->nextSequenceId(); if ($this->sequenceValue === null) { return $insert; } $insert->values(array($this->primaryKeyField => $this->sequenceValue), Insert::VALUES_MERGE); return $insert; } public function postInsert(StatementInterface $statement, ResultInterface $result) { if ($this->sequenceValue !== null) { $this->tableGateway->lastInsertValue = $this->sequenceValue; } } /** * Generate a new value from the specified sequence in the database, and return it. * @return int */ public function nextSequenceId() { $platform = $this->tableGateway->adapter->getPlatform(); $platformName = $platform->getName(); switch ($platformName) { case 'Oracle': $sql = 'SELECT ' . $platform->quoteIdentifier($this->sequenceName) . '.NEXTVAL FROM dual'; break; case 'PostgreSQL': $sql = 'SELECT NEXTVAL(\'' . $this->sequenceName . '\')'; break; default : return null; } $statement = $this->tableGateway->adapter->createStatement(); $statement->prepare($sql); $result = $statement->execute(); $sequence = $result->current(); unset($statement, $result); return $sequence['nextval']; } /** * Return the most recent value from the specified sequence in the database. * @return int */ public function lastSequenceId() { $platform = $this->tableGateway->adapter->getPlatform(); $platformName = $platform->getName(); switch ($platformName) { case 'Oracle': $sql = 'SELECT ' . $platform->quoteIdentifier($this->sequenceName) . '.CURRVAL FROM dual'; break; case 'PostgreSQL': $sql = 'SELECT CURRVAL(\'' . $this->sequenceName . '\')'; break; default : return null; } $statement = $this->tableGateway->adapter->createStatement(); $statement->prepare($sql); $result = $statement->execute(); $sequence = $result->current(); unset($statement, $result); return $sequence['currval']; } }