如何在cakePHP中进行PDO查询?

2o7dmzc5  于 2022-11-11  发布在  PHP
关注(0)|答案(2)|浏览(156)

我的意思是,在某个地方必须有一个初始化的PDO对象,我想使用它,而不是创建一个并行连接。
应要求,以下是它背后的故事:我正在制作一个注册表单,它保存到两个模型(Firms和Users)中,它们之间有一个HABTM连接。CakePHP不能在这个表单中使用HABTM,所以在不破坏模型的情况下,我不得不这样做:

if ($this->request->is('post')) {

        $this->Firm->create();
        if ($this->Firm->saveAll($this->request->data)) {

            for($i=0; $i<count($this->request->data['User']); $i++){ //működik :)
                $this->User->create(); // ?

                $a = $this->request->data['User'][$i];

                $b = randomString(28);
                $a['password'] = $b;
                $a['plain_password'] = $b;
                if($this->User->save($a)){
                    $this->Session->setFlash(__('The firm and a user have been saved.')); // no good
                }
            }

            //$this->Session->setFlash(__('The firm has been saved.'));
             return $this->redirect(array('action' => 'index'));
        } else {
            $this->Session->setFlash(__('The firm could not be saved. Please, try again.'));
        }

我只想做一个查询,比如INSERT INTO firms_users (user_id,firm_id) VALUES ($u,$f),因为这是模型不能为我做的,因为HABTM。
如果使用事务来完成这一点就太好了,但是我想,使用cakePHP标准,这是根本不可能的。

iq3niunx

iq3niunx1#

访问数据源

您可以使用Model::getDataSource()来存取模型的数据来源。
另请参阅:http://book.cakephp.org/2.0/en/models/datasources.html

运行手动查询

如果要运行手动查询而不使用Cake的内置模型查询方法和关系,可以执行以下操作:

$this->MyModel->query("INSERT INTO firms_users (user_id,firm_id) VALUES ($u, $f)");

请记住,此处的数据不受SQL注入的保护。

交易记录

我刚刚看到了你的编辑想要运行一个事务。是的,你可以用Cake来做这个。一个模型的数据源对象有这样的方法。你只需要在你的查询中涉及到的任何一个模型上开始事务。

// Get the datasource
$datasource = $this->getDataSource();

// Start transaction
$datasource->begin();

// Rollback
$datasource->rollback();

// Commit
$datasource->commit();

http://book.cakephp.org/2.0/en/models/transactions.html

68bkxrlz

68bkxrlz2#

您可以从任何地方访问数据库连接的PDO对象。(使用“默认”DB概要文件或替换为不同的DB概要文件。)
CakePHP 2示例:

App::uses('ConnectionManager', 'Model');
$Connection  = ConnectionManager::getDataSource('default')
$PDO         = $Connection->getConnection();

CakePHP 3示例:

/**@var \Cake\Database\Connection $Connection */
$Connection = ConnectionManager::get('default');
if (!$Connection->isConnected())
    $Connection->connect();

$PDO = $Connection->getDriver()->getConnection();

# To access PDO inside `Cake\ORM\Table` objects

# you can use `$Connection = $this->getConnection();`

相关问题