我必须使用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'));
}