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