2013-04-09 17 views
15

Ich bin mit dem Erhalten letzten Insert-ID mit Zend Framework 2 stecken und ich gab auf diesem bis ...ZF2 Wie erhält man den letzten Insert-ID-Wert?

Es ist erprobte Kombinationen:

var_dump($this->tableGateway->insert($insert)); 
var_dump($this->tableGateway->lastInsertValue); 
var_dump($this->tableGateway->getLastInsertValue()); 
var_dump($this->tableGateway->getAdapter()->getDriver()->getConnection()->getLastGeneratedValue()); 

Wert auf Tabelle einfügen, aber jede Zeile (mit Ausnahme zuerst, die int "1" gibt) gibt null zurück. Bitte sag mir nicht, dass solch ein großes Framework keine Möglichkeit bietet, den letzten Insert-ID-Wert zu erhalten !?

+0

Try' $ this-> tableGateway-> getAdap ter() -> lastInsertId(); ' – phpisuber01

+0

Schwerwiegender Fehler: Aufruf zu undefinierter Methode Zend \ Db \ Adapter \ Adapter :: lastInsertId() – Piotr

+0

Hmmm ...' $ this-> lastInsertValue; 'oder' $ this-> tableGateway -> lastInsertValue; 'Nur was ich mir vorstellen kann. – phpisuber01

Antwort

4

In Postgres müssen Sie Setup SequenceFeature:

... 
use Zend\Db\TableGateway\Feature; 
... 
public function setDbAdapter(Adapter $adapter) { 
    ... 
    $this->featureSet = new Feature\FeatureSet(); 
    $this->featureSet->addFeature(new Feature\SequenceFeature('YOUR_FIELD_NAME','YOUR_SEQUENCE_NAME')); 
    $this->initialize(); 
} 

Nun sollte $this->tableGateway->getLastInsertValue(); arbeiten.

+0

Das Buch Zend Framework 2.0 von Beispiel Einsteiger Guide besagt, dass getLastInsertValue() Gibt den ersten Einfügewert für den Primärschlüssel der Tabellen zurück. Der Rückgabetyp ist eine Ganzzahl. – Julian

26

Hier ist, was ich benutze:

$data = array()// Your data to be saved; 
$this->tableGateway->insert($data); 
$id = $this->tableGateway->lastInsertValue; 
+0

Probieren Sie es einfach aus und es funktioniert perfekt. –

1

In App\Model\AlbumTable die AbstractTableGateway ich letzte id von $inserted_id = $this->lastInsertValue;

als Beispiel erweitert:

if ($id == 0) { 
      $this->insert($data); 
      $inserted_id = $this->lastInsertValue;  
     } elseif ($this->getAlbum($id)) { 
      $this->update(
       $data, array(
       'id' => $id, 
       ) 
      ); 
     } else { 
      throw new \Exception('Form id does not exist'); 
     } 
4

Ok, ich weiß, die Frage ist nur wenige Monate alt, obwohl es sein kann, nützlich für diejenigen, die nach einer Lösung für dieses Problem suchen, um die letzten Einfügewerte zu erhalten, ist der beste Weg, den Wert von der Adapterschnittstelle

zu bekommen

Das funktionierte gut für mich für MySQL-Datenbank

+0

Beste Antwort +1, und wird auch auf Ihre anderen Antworten +1. – YumYumYum

6

Ich weiß, dass dies eine Weile zurück, aber nach einer Menge Zeit an diesem Problem zu verbringen wollte ich die Lösung für die Zukunft Googler schreiben das gleiche Problem auftritt.

Das Problem ist der PGSQL Fahrer einen Namen der Sequenz erfordert den letzten id wie folgt zurück:

$adapter->getDriver()->getLastGeneratedValue("sequence_name"); 

Die in 2.3.1 funktioniert. In 2.2.2 (und möglicherweise später) gab es einen Fehler, bei dem der Name kein Parameter des getLastGeneratedValue im Treiber war. Daher müssten Sie die Verbindung direkt aufrufen.

$adapter->getDriver()->getConnection()->getLastGeneratedValue 

Also das ist, was ich gefunden habe, indem ich durch den Code sah. Beste Lösung ist, um sicherzustellen, Sie haben ZF2 aktualisiert, und verwenden Sie

$adapter->getDriver()->getLastGeneratedValue("sequence_name"); 
+2

Dies ist die einzige Lösung, die ich finden konnte, die für mich arbeitete. – Programmer

0

Es gibt eine andere Möglichkeit FeatureSet zu TableGateway hinzuzufügen.

In module.php können Sie (Tabelle Benutzer zum Beispiel) definieren

  'UserTableGateway' => function ($sm) { 
       $dbAdapter = $sm->get('Zend\Db\Adapter\Adapter'); 
       $resultSetPrototype = new ResultSet(); 
       $resultSetPrototype->setArrayObjectPrototype(new UserEntity()); 
       return new TableGateway('user', $dbAdapter, new Feature\SequenceFeature('user','user_id_seq'), $resultSetPrototype); 

Aber es ist ein Fehler in SequenceFeature. Alles ist in Ordnung, wenn Sie ein öffentliches Schema verwenden. Wenn Sie ein anderes Schema verwenden müssen, sollten Sie Zend \ Db \ Sql \ TableIdentifier verwenden;

In diesem Fall Modul.php sollte sein:

  'UserTableGateway' => function ($sm) { 
       $dbAdapter = $sm->get('Zend\Db\Adapter\Adapter'); 
       $resultSetPrototype = new ResultSet(); 
       $resultSetPrototype->setArrayObjectPrototype(new UserEntity()); 
       return new TableGateway(new TableIdentifier('user','someSchema'), $dbAdapter, new Feature\SequenceFeature(new TableIdentifier('user','someSchema'),'user_id_seq'), $resultSetPrototype); 

In diesem Fall wird ein Fehler mit Postgresql Abfrage SELECT NEXTVAL, weil Eigenschaft \ SequenceFeature öffentliches Schema statt in erstem Argumente definiert verwenden Abfrage

SELECT NEXTVAL ('user_id_seq vorzubereiten ')

In diesem Fall sQL-Abfrage

SELECT NEXTVAL sein sollte (' someSchema‘. 'user_id_seq')

Verwandte Themen