繁体   English   中英

如何在cakephp中使用事务?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM