2015-02-05 78 views
2

我正在使用CakePHP 3.x如何在CakePHP3中運行事務,同時檢索最後一個插入標識併爲PostgreSQL和MySQL工作?

There is a way to execute transactions in CakePHP 3.x

但是,我的一些執行語句需要先前插入語句的ID。

如何在選擇CakePHP 3.x並允許PostgreSQL或MySQL作爲我的數據庫時在事務中執行該操作?

我預期的查詢是這樣的:

INSERT INTO dynamic_views (`title`, `created`) values ('view 37', NOW()); 

-- take the id of the above insert query and assuming the view id is 37 
INSERT INTO users_access_dynamic_views(user_id, view_id) values (44, 37); 

我想執行使用CakePHP3.x上述使用事務。

同時,我想問一下,如果對上述情況使用交易是否被認爲是一個壞主意?

+0

這是一個交易的一個很好的例子。 –

+0

好的,那麼我如何檢索第一個查詢的最後一個插入ID,以便我可以在第二個查詢上運行它以進行事務處理? –

回答

3

執行INSERT查詢後,您可以撥打lastInsertId()用正確的參數,以獲得正確的值:

$connection->transactional(function ($connection) { 
    $statement = $connection->newQuery 
     ->insert($fields) 
     ->into($table) 
     ->values($values) 
     ->execute(); 

    $insertId = $statement->lastInsertId($table, 'id'); // id is primary key 
}); 
+1

我想我需要這樣做:'函數($連接)使用($ fields,$ table,$ values)'?? –

+0

是的,你通過你需要傳遞的參數:) –

+0

你會建議我在這種情況下使用交易嗎?或者你會建議使用afterSave或使用if語句來檢查第一次插入是否成功?因爲我無法在Cake3文檔中找到saveAssociated。所以我不知道該怎麼做。 –

0

在MySQL中獲取最後插入的ID的函數被稱爲last_insert_id(),而在PostgreSQL中則是lastval()。因此,要麼必須在兩者之間創建映射,要麼檢查CakePHP中使用的驅動程序,然後調用特定的函數。

例如,您可以在PostgreSQL中創建以下函數。

CREATE FUNCTION last_insert_id() RETURNS BIGINT AS $$ 
    SELECT lastval(); 
$$ LANGUAGE sql VOLATILE; 

然後,您可以在第二個查詢中調用它,它將在MySQL和PostgreSQL中都可以使用。

INSERT INTO users_access_dynamic_views 
    (user_id, view_id) 
VALUES 
    (44, LAST_INSERT_ID()); 

心靈也是PostgreSQL使用序列生成的ID,所以依靠簡單地lastval當有涉及觸發(自己的地方插入數據)可能會產生意想不到的效果。因此,通過currval明確指定涉及的序列總是更好。

CURRVAL(PG_GET_SERIAL_SEQUENCE('dynamic_views', 'view_id')) 
相關問題