[英]How to use transactions in cakephp?
我正在嘗試使用帶有setConnection()的commit,但是它不起作用...我不知道如何使事務在cakephp中工作
我在文檔中發現了以下內容: https : //book.cakephp.org/3.0/en/orm/database-basics.html#using-transactions
但是我無法實現...問題是我想保證保存兩個實體:
$this->Users->save($user) and $clientTable->save($client)
這是我的代碼:
public function register()
{
$locator = TableRegistry::getTableLocator();
$clientTable = $locator->get("Clients");
$user = $this->Users->newEntity();
$client = $clientTable->newEntity();
if ($this->request->is('post')) {
$request = $this->request->getData();
$user = $this->Users->patchEntity($user, $request);
$result = false;
// begin()
if ($this->Users->save($user)) {
$request['user_id'] = $user->id;
$client = $clientTable->patchEntity($client, $request);
if ($clientTable->save($client)) {
$result = true;
}
}
if ($result) {
// commit()
$this->Flash->success(__('The user has been registered.'));
return $this->redirect([
'action' => 'login'
]);
} else {
// rollback()
}
$this->Flash->error(__('The user could not be registered. Please, try again.'));
}
$this->set(compact('$user'));
}
您可以嘗試以下代碼:
try {
$this->Users->getConnection()->begin();
$this->Users->saveOrFail($userEntity, ['atomic' => false]);
$this->Users->getConnection()->commit();
} catch(\Cake\ORM\Exception\PersistenceFailedException $e) {
$this->Users->getConnection()->rollback();
}
我認為我能夠通過“交易”進行交易。
在我的測試中,如果Clients實體中存在錯誤,則不會保存Users實體。
我不知道這是否是最好的方法,但是確實有效
public function register()
{
$locator = TableRegistry::getTableLocator();
$userTable = $locator->get("Users");
$clientTable = $locator->get("Clients");
$user = $userTable->newEntity();
$client = $clientTable->newEntity();
if ($this->request->is('post')) {
$request = $this->request->getData();
$user = $userTable->patchEntity($user, $request);
$conn = ConnectionManager::get('default');
try {
$conn->transactional(function ($conn) use ($userTable, $clientTable, $user, $client, $request) {
$userTable->saveOrFail($user, [
'atomic' => false
]);
$request['user_id'] = $user->id;
$client = $clientTable->patchEntity($client, $request);
$clientTable->saveOrFail($client, [
'atomic' => false
]);
});
$this->Flash->success(__('The user has been registered.'));
return $this->redirect([
'action' => 'login'
]);
} catch (\Cake\ORM\Exception\PersistenceFailedException $e) {
$this->Flash->error(__('Error on save: {0}', $e->getMessage()));
return $this->redirect([
'action' => 'register'
]);
}
$this->Flash->error(__('The user could not be registered. Please, try again.'));
}
$this->set(compact('$user'));
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.