为了账号安全,请及时绑定邮箱和手机立即绑定

如何在 cakephp 中使用事务?

如何在 cakephp 中使用事务?

PHP
慕哥6287543 2021-08-28 10:28:56
我正在尝试将提交与 setConnection() 一起使用,但它不起作用......我不知道如何在 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'));    }
查看完整描述

2 回答

?
慕丝7291255

TA贡献1859条经验 获得超6个赞

您可以尝试以下代码:


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

}


查看完整回答
反对 回复 2021-08-28
?
天涯尽头无女友

TA贡献1831条经验 获得超9个赞

我想我能够用“交易”来进行交易。


在我的测试中,如果 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'));

    }


查看完整回答
反对 回复 2021-08-28
  • 2 回答
  • 0 关注
  • 174 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信