【发布时间】:2012-01-21 18:56:52
【问题描述】:
我对 CodeIgniter 还很陌生,正在尝试找出一些我认为应该很容易但实际上并不容易的东西。
我的应用程序对 Product 对象做了一些处理,目前我只是通过 CodeIgniter 的 Database 类中包含的 ActiveRecord 功能来做这些。我通常更喜欢 ORM 而不是 ActiveRecord,以便正确地将业务逻辑与数据库逻辑分开。不过在这种情况下,使用 Products 的对象通常会自己处理所有业务逻辑,所以我认为这种分离仍然有效。
我的产品对象通过store() 方法与数据库交互,我希望接受数据库连接作为参数。 store() 方法首先查询数据库以确定相关产品是否已经以某种形式存在。如果是,则使用新信息更新产品,如果不是,则插入产品。容易的东西。问题是,我想对store() 方法参数使用类型提示,这样我就可以确定没有任何对象不能使用基本的CodeIgniter 数据库/ActiveRecord 函数传递给该方法,而不会引发相应的错误。
在我的一生中,我无法弄清楚 CodeIgniter 数据库类的类型。在稍微阅读了源代码之后,我想了一会儿,CI_DB_driver 类就是那个。但是,当我将其用作类型提示时,我的 IDE(确切地说是 NetBeans 7.01)无法识别或给我任何 ActiveRecord 函数(如 insert() 或 get_where())的代码完成选项。我不认为我的 IDE 在这方面有问题,因为它确实识别像 query() 或 insertString() 这样的方法。
我可以使用标准 CodeIgniter 访问/连接数据库的方式,即使用内部 CodeIgniter 对象的加载方法来实例化数据库对象,但我有点希望插入或更新 Products 作为有点混蛋的 Unit工作模式。我不需要使用事务,因为 Product 对象不依赖于任何其他 Product 对象的成功插入或更新(使用 Product 对象的类也不依赖)。但是,我不想为每个要插入或更新的 Product 对象创建一个全新的连接,也不想将它们与持久数据库连接联系起来。我宁愿做一些更类似于以下的事情:
// catalog class is just an example
class Catalog extends CI_Model
{
public function updateCatalog(array &$products, $dbconn = null) {
if ($dbconn === null) {
try {
$dbconn = $this->load->database('default', true);
} catch (SQLException $e) {
show_error($e->getMessage);
}
$close_db = true;
}
foreach ($products as $product) {
try {
// use the same db connection for all product storage tasks
$product->store($dbconn);
} catch (SQLException $e) {
show_error($e->getMessage);
}
}
if ($close_db) {
$dbconn->close(); // free up database connection for other tasks
}
}
...
这是一个非常基本的例子。如果另一个方法需要调用上述方法,它将实例化数据库连接对象本身,并将其传入。理想情况下,我的目标是每个整体请求一个数据库连接。
有没有人深入研究过 CodeIgniter 源代码,知道我应该使用什么作为数据库对象的类型提示?我正在做一个不好的方法来使用 CodeIgniter 吗?使用实现连接池的方法覆盖 CodeIgniter 功能会更好吗?
【问题讨论】:
标签: php codeigniter database-connection