如何将cakephp 2与自定义数据库连接和原始查询一起使用

时间:2013-08-24 13:13:34

标签: cakephp

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

现在我做以下事情: 每个模型的每个方法都连接到数据库并检索数据

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

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

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

2 个答案:

答案 0 :(得分:0)

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

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

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

答案 1 :(得分:0)

真的是否需要扩展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'));
}