codeigniter实例化的数据库对象的类型是什么?

时间:2011-12-16 07:12:27

标签: php codeigniter database-connection

我是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功能会更好吗?

2 个答案:

答案 0 :(得分:1)

$this->load->database()返回的数据库对象的类型实际上是CI_DB_driver,这是我希望的。实际上,类型是CI_DB_(插入您的数据库类型)_driver,但这继承自CI_DB_driver。

我不知道这对任何人是否会有所帮助,但我会把它放在那里以防万一。

答案 1 :(得分:0)

不确定类型提示的含义,但看起来您不想使用CodeIgniter数据库类。那么为什么不包括你喜欢的外部ORM类而不是乱用CodeIgniter?

查看以下资源: