【问题标题】:what is the type of the database object instantiated by codeigniter?codeigniter 实例化的数据库对象的类型是什么?
【发布时间】: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


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

      不确定您所说的类型提示是什么意思,但您似乎不想使用 CodeIgniter 数据库类。那么你为什么不包含你喜欢的外部 ORM 类而不是乱用 CodeIgniter 呢?

      查看以下资源:

      【讨论】:

      • 类型提示不是我的 store 方法定义是 store($dbconn),而是(例如)store(CI_DB $dbconn)。这使我可以确保只有扩展某个类或实现某个接口的对象才能传递给方法。对于这个问题,ORM 有点矫枉过正,因为我提到的 Product 对象几乎是唯一需要任何类型的自定义功能的对象。如果应用程序扩展到我需要的地方,我会考虑 ORM。
      • 嗯,我从没想过 ORM 是矫枉过正。您可以使用get_class() 或get_parent_class() 找到正确的类型提示类。
      猜你喜欢
      • 1970-01-01
      • 2018-10-29
      • 1970-01-01
      • 2018-09-25
      • 2019-07-01
      • 2016-04-20
      • 2015-06-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多