如何将cakehp2与自定义数据库连接和原始查询结合使用



我必须使用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管理数据库连接的打开和关闭,并让模型只检索数据?我对任何数据库抽象层都不感兴趣。

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

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

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

您真的需要扩展Cake Model类吗?

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
    }
}

SomeController:

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'));
}

最新更新