我是CodeIgniter的新手,我想弄清楚我觉得应该很容易的事情。
我的应用程序对Product对象有所帮助,在momenet上我只是通过CodeIgniter的Database类中包含的ActiveRecord功能进行操作。我通常更喜欢ORM而不是ActiveRecord,以便将业务逻辑与数据库逻辑正确分开。但在这种情况下,使用Products的对象通常会自己处理所有业务逻辑,因此我认为分离仍然有效。
My Product对象通过store()
方法与数据库交互,我希望接受数据库连接作为参数。 store()
方法首先查询数据库,以确定相关产品是否已经以某种形式存在。如果是,则使用新信息更新产品,如果没有,则插入产品。简单的东西。问题是,我想对store()
方法参数使用类型提示,这样我就可以确保没有基本CodeIgniter数据库/ ActiveRecord函数的对象传递给方法而不会引发相应的错误。
对于我的生活,我无法弄清楚CodeIgniter数据库类的类型。通过阅读源代码后,我想了一会儿CI_DB_driver类就是那个。但是,当我将其用作类型提示时,我的IDE(确切地说是NetBeans 7.01)无法识别或为我提供ActiveRecord函数的任何代码完成选项,例如insert()
或get_where()
。我认为我的IDE没有错,因为它确实识别query()
或insertString()
等方法。
我可以使用标准的CodeIgniter访问/连接数据库的方式,即使用内部CodeIgniter对象的load方法来实例化数据库对象,但我有点希望插入或更新Products作为一个有点卑鄙的单元的一部分工作模式。我不需要使用事务,因为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功能会更好吗?
答案 0 :(得分:1)
$this->load->database()
返回的数据库对象的类型实际上是CI_DB_driver,这是我希望的。实际上,类型是CI_DB_(插入您的数据库类型)_driver,但这继承自CI_DB_driver。
我不知道这对任何人是否会有所帮助,但我会把它放在那里以防万一。
答案 1 :(得分:0)
不确定类型提示的含义,但看起来您不想使用CodeIgniter数据库类。那么为什么不包括你喜欢的外部ORM类而不是乱用CodeIgniter?
查看以下资源: