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

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

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

pbwdgjma

pbwdgjma1#

我认为您可以创建自己的OracleBehavior,每个模型都可以使用这个行为,在其中,您可以覆盖或扩展Model的find()行为,以构建一个传统的oracle查询并运行它(我对Oracle了解不多)。
然后,在Behavior的beforeFind()中,您可以打开连接,在Behavior的afterFind()中,您可以关闭数据库连接。
这样,每次运行查询之前,它都会自动打开连接,而每次查找之后,它都会关闭连接。您可以使用beforeSave()和afterSave()以及beforeDelete()和afterDelete()执行相同的操作。(您可能希望在Behavior中创建一个connect()方法和disconnect()方法,这样就不会在每个beforeX()方法中有重复的代码。

iibxawm4

iibxawm42#

真的需要扩展一个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
    }
}

某个控制器:

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

相关问题