0

我必须使用 cakephp 不支持的旧数据库驱动程序 (ora_logon) 来处理 Oracle 数据库。我不能改用 oci 驱动程序。

现在我执行以下操作:每个模型的每个方法都连接到数据库并检索数据

class SomeClass extends Model {
    public function getA(){
        if ($conn=ora_logon("username","password"){
            //make the query
            // retrieve data
            //put data in array and return the array
        }
    }

    public function getB(){
        if ($conn=ora_logon("username","password"){
            //make the query
            // retrieve data
            //put data in array and return the array
        }
    }
}

我知道这不是最好的方法。我如何让 cakephp 管理打开和关闭与数据库的连接并让模型只检索数据?我对任何数据库抽象层都不感兴趣。

4

2 回答 2

0

我认为您可以制作自己的 OracleBehavior。每个模型都可以使用这种行为,并且在其中,您可以覆盖或扩展模型的 find() 行为以构建传统的 oracle 查询并运行它(我对 Oracle 不太了解)。

然后,在您的 Behavior 的beforeFind()中,您可以打开您的连接,在您的 Behavior 的afterFind()中,您可以关闭您的数据库连接。

这样,每次运行查询之前,它都会自动打开连接,而每次查找后它都会关闭它。您可以对 beforeSave() 和 afterSave() 以及 beforeDelete() 和 afterDelete() 执行相同的操作。(您可能希望在 Behavior 中创建单个connect()方法和disconnect()方法,因此每个 beforeX() 方法中没有重复的代码。

于 2013-08-24T15:01:40.847 回答
0

真的需要扩展一个蛋糕模型类吗?

class SomeClass extends Model {
    private $conn;
    public function constructor() {
        parent::constructor();
        $conn = ora_logon("username","password");
        if(!$conn)
            throw new Exception();
    }

    public function getA() {
        //Some code
    }
}

一些控制器:

App::uses('SomeClass','Model');

public function action() {
    $data = array();
    $error = null;
    try{
        $myDb = new SomeClass();
        $data = $myDb->getA();
    } catch($e) {
        $error = 'Cannot connect to database';
    }
    $this->set(compact('data', 'error'));
}
于 2013-08-25T12:06:07.307 回答