2013-04-09 11 views
15

Tôi đang mắc kẹt với việc chèn cuối cùng id với Zend framework 2 và tôi đã lên trên này ...ZF2 Làm cách nào để nhận giá trị id chèn cuối cùng?

kết hợp Có thử:

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

Giá trị được chèn vào bảng, nhưng mỗi dòng (trừ đầu tiên, cho phép int "1") trả về null. Xin đừng nói với tôi, rằng một khung công tác lớn như vậy không cho khả năng để có được giá trị id chèn cuối cùng?

+0

Hãy thử '$ this-> tableGateway-> getAdap ter() -> lastInsertId(); ' – phpisuber01

+0

Lỗi nghiêm trọng: Gọi đến phương thức chưa xác định Zend \ Db \ Adapter \ Adapter :: lastInsertId() – Piotr

+0

Hmmm ...' $ this-> lastInsertValue; 'hoặc' $ this-> tableGateway -> lastInsertValue; 'Điều duy nhất tôi có thể nghĩ đến. – phpisuber01

Trả lời

4

Trong postgres bạn cần thiết lập 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(); 
} 

Bây giờ $this->tableGateway->getLastInsertValue(); nên làm việc.

+0

Cuốn sách Zend Framework 2.0 bằng ví dụ hướng dẫn người mới bắt đầu nói rằng getLastInsertValue() Trả về giá trị chèn lst cho khóa chính của bảng. Kiểu trả về là một số nguyên. – Julian

26

Dưới đây là những gì tôi sử dụng:

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

Chỉ cần thử này và nó hoạt động hoàn hảo. –

1

Trong App\Model\AlbumTable kéo dài AbstractTableGateway tôi nhận được id cuối bởi $inserted_id = $this->lastInsertValue;

làm ví dụ:

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, tôi biết câu hỏi là vài tháng tuổi, mặc dù nó có thể hữu ích cho những người đang tìm kiếm giải pháp cho vấn đề này để có được giá trị chèn cuối cùng, cách tốt nhất là lấy giá trị từ giao diện bộ điều hợp

do your insert //then 
$id = $adapter->getDriver()->getLastGeneratedValue(); 

này làm việc tốt cho tôi vì cơ sở dữ liệu mysql

+0

TRẢ LỜI TỐT NHẤT 1 và cũng sẽ +1 các câu trả lời khác của bạn. – YumYumYum

6

Tôi biết điều này là một thời gian trở lại, nhưng sau khi trải qua một tấn thời gian trên vấn đề cụ thể này, tôi muốn gửi giải pháp cho nhân viên của Google trong tương lai trải qua cùng một vấn đề.

Vấn đề là người lái xe pgSQL đòi hỏi một tên của chuỗi để trả lại id cuối cùng như thế này:

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

này hoạt động trong 2.3.1. Có một lỗi trong 2.2.2 (và có thể sau này) trong đó tên không phải là một tham số của getLastGeneratedValue trong trình điều khiển, vì vậy bạn phải gọi kết nối trực tiếp.

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

Vì vậy, đó là những gì tôi tìm thấy bằng cách xem qua mã. Giải pháp tốt nhất là đảm bảo bạn đã cập nhật ZF2 và sử dụng

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

Đây là giải pháp duy nhất tôi có thể tìm thấy có hiệu quả đối với tôi. – Programmer

0

Có một khả năng khác để thêm FeatureSet vào TableGateway.

Trong Module.php bạn có thể xác định (bảng tài khoản ví dụ)

  '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); 

Nhưng có một lỗi trong SequenceFeature. Mọi thứ đều ổn, khi bạn sử dụng lược đồ công khai. Khi bạn phải sử dụng lược đồ khác, bạn nên sử dụng Zend \ Db \ Sql \ TableIdentifier;

Trong trường hợp này là Mô-đun.php nên là:

  '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); 

Trong trường hợp này sẽ là một lỗi với PostgreSQL truy vấn SELECT NEXTVAL, bởi vì tính năng \ SequenceFeature sẽ sử dụng sơ đồ công cộng thay vì quy định tại đối số đầu tiên để chuẩn bị truy vấn

CHỌN NEXTVAL ('user_id_seq ')

Trong trường hợp này truy vấn sql nên

CHỌN NEXTVAL (' someSchema'. 'user_id_seq')