каков тип объекта базы данных, созданного codeigniter? - PullRequest
0 голосов
/ 16 декабря 2011

Я довольно новичок в CodeIgniter и пытаюсь понять, что, по моему мнению, должно быть легко, а не просто.

Мое приложение работает с объектами Product, что в настоящее время я делаю только с помощью функций ActiveRecord, включенных в класс DatabaseIgniter класса. Обычно я предпочитаю ORM ActiveRecord, чтобы правильно отделить бизнес-логику от логики базы данных. В этом случае, однако, объекты, которые используют Продукты, обычно сами обрабатывают всю бизнес-логику, поэтому я думаю, что разделение все еще действует.

Объекты My Product взаимодействуют с базой данных с помощью метода store(), который я хотел бы принять в качестве параметра для подключения к базе данных. Метод store() сначала запрашивает базу данных, чтобы определить, существует ли данный продукт в какой-либо форме. Если это так, продукт обновляется с новой информацией, а если нет, продукт вставляется. Легкие вещи. Проблема в том, что я хочу использовать подсказку типа для параметра метода store(), чтобы быть уверенным в том, что никакие объекты, неспособные к базовым функциям базы данных / ActiveRecord CodeIgniter, не будут переданы методу без возникновения соответствующей ошибки.

Насколько я могу судить, я не могу определить тип класса базы данных CodeIgniter. Прочитав немного исходного кода, я немного подумал, что класс CI_DB_driver был единственным. Однако, когда я использую это в качестве подсказки типа, моя среда IDE (точнее, NetBeans 7.01) не распознает и не предоставляет никаких вариантов завершения кода для функций ActiveRecord, таких как insert() или get_where(). Я не думаю, что моя IDE виновата в этом, потому что она распознает такие методы, как query() или insertString().

Я мог бы использовать стандартный способ CodeIgniter для доступа / подключения к базам данных, т. Е. Использовать метод загрузки внутреннего объекта CodeIgniter для создания экземпляра объекта базы данных, но я как бы надеялся вставить или обновить Продукты как часть несколько обескураженного модуля Рабочий шаблон. Мне не нужно использовать транзакции, поскольку объекты 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 ]

1 голос
/ 23 декабря 2011

Тип объекта базы данных, возвращаемого $this->load->database(), на самом деле является CI_DB_driver, как я и надеялся.На самом деле типом является CI_DB_ (укажите тип вашей базы данных) _driver, но он наследуется от CI_DB_driver.

Я не знаю, будет ли это когда-нибудь полезным для кого-либо, но я выкладываю это на всякий случай.

0 голосов
/ 16 декабря 2011

Не уверен, что вы подразумеваете под подсказкой типа, но похоже, что вы не хотите использовать класс базы данных CodeIgniter. Так почему бы вам не включить внешний класс ORM, который вам нравится, вместо того, чтобы возиться с CodeIgniter?

Проверьте следующие ресурсы:

...