CodeIgniter, модели и ORM, как с этим бороться? - PullRequest
37 голосов
/ 26 января 2010

Я начинаю с CodeIgniter и после нескольких часов погружений в Google я немного растерялся.

Давайте попробуем объяснить мой вопрос на простом примере: у меня есть таблица 'car' с полями 'name' и 'color'. Поэтому я хочу иметь класс php Car, чтобы мой код мог выглядеть примерно так:

$car = new Car('BMW', 'red'); //new $car Object
$car->save(); //this will make an SQL insert to the table 'car'

//Lets query all cars
$cars = Car::get_all(); 
//cars will be an array of Car objects, (not a set of rows!)

Поэтому я ищу что-то очень похожее на то, что у вас есть в RubyOnRails или Django (Python). Мне нужно обрабатывать все виды отношений и уметь писать код по-настоящему OOP + MVC.

Вот мои неудачные подходы, чтобы получить его:

Использование внешнего ORM (DataMapper, Doctrine, AcidCrud ...)

Они либо требуют слишком много настроек, либо плохо обрабатывают отношения.

Использование классов CodeIgniter (для расширения класса Model CodeIgniter)

class Car extends Model{
public function Car($name='',$color='')
{
    $this->name     =   $name;
    $this->color    =   $color;      
    parent::Model();
}
public function save()
{
    $data = array(
                   'name'   =>  $this->name ,
                   'color'  =>  $this->color 
                  );

    $this->db->insert('cars' $data);
}

И так далее. Проблема с этим подходом заключается в том, что если сделать var_dump () объекта $ car, я вижу, что он содержит много вещей из CodeIgniter, таких как объекты CI_Config, CI_Input, CI_Benchmark и т. д. Поэтому я думаю, что это не очень хорошее решение, потому что каждый объект моего класса Car будет содержать много повторяющихся данных (он будет иметь низкую производительность!), не так ли?

Не используются модели CodeIgniter

Я мог бы создавать свои модели, не расширяя их из класса Model в CodeIgniter, а затем используя обычный конструктор PHP5 (__construct () вместо функции Car ()), но проблема в этом случае заключается в следующем: как получить доступ к объекту $ db сделать запросы, используя ActiveRecord CodeIgniter? и как я загружаю модели (его классы) в контроллеры?

Ответы [ 10 ]

14 голосов
/ 26 января 2010

Вы, вероятно, хотите что-то вроде этого:

   class Cars {

    //List all neccessary vars here

    function __construct() {
        //get instance of Codeigniter Object and load database library
        $this->obj =& get_instance();
        $this->obj->load->database();
    }

//You can now list methods like so:
function selectCar($name, $color) {

        $this->obj->db->select('color')->from('car')->where('color', $color);
        $query = $this->obj->db->get();

        switch ($query->num_rows()) {
        case 0:
            return false;
            break;
        default:
            return $query->result();
            break;
        }
    }

Надеюсь, это поможет!

9 голосов
/ 01 февраля 2010

Попробуйте с Doctrine , отличный ORM и может быть легко интегрирован в CodeIgniter.

4 голосов
/ 26 января 2010

Посмотрите вики-страницу codeigniter для ORM

http://codeigniter.com/wiki/ORM/

3 голосов
/ 28 мая 2011

Для будущих Google, вот учебник Я написал о том, как интегрировать CodeIgniter 2 с Doctrine 2.

Дайте мне знать, если у вас есть какие-либо проблемы.

2 голосов
/ 02 июня 2012

проверить ГАЗ ОРМ это звучит довольно хорошо, удобно и легко в использовании. некоторые особенности этой реализации ORM для CodeIgniter:

  • Поддерживаемые базы данных: cubrid, mssql, mysql, oci8, odbc, postgre, sqlite, sqlsrv. (включая PDO, если вы продолжаете синхронизацию с CI-репо)
  • Поддержка нескольких соединений с базой данных.
  • Поддержка нескольких отношений.
  • Поддержка составных ключей (для ключа, определяющего отношения).
  • Автоматическое создание моделей из таблиц базы данных и наоборот.
  • Автоматическая синхронизация таблиц моделей путем создания файла миграции.
  • Кэширование по запросу.
  • Столбец / данные с самоссылкой и смежностью (иерархические данные).
  • Стремительная загрузка, чтобы максимизировать ваши отношения запросов (для повышения производительности).
  • Различные методы поиска (могут быть связаны с большей частью CI AR) и агрегаты.
  • Проверка и автоматический сбор входных данных с минимальной настройкой.
  • Зацепляет очки за контроль над вашей моделью.
  • Расширения для совместного использования вашей общей функции / библиотеки в вашей модели.
  • Транзакции и другие деликатесы CI AR.
  • Включен набор тестов phpunit для обеспечения большей согласованности API.

есть одна форма с поддержкой искры -> поэтому ее легко установить

2 голосов
/ 22 июля 2010

Мне повезло с использованием Propel с codeigniter.

1 голос
/ 19 января 2011

Я использовал CodeIgniter с Propel, и они действительно хорошо перемешались. Я использовал это некоторое время и получил несколько веб-приложений, работающих таким образом. Так как я нашел несколько ужасных способов сделать это (некоторые включали изменение конфигурации Apache !!). Я решил опубликовать пост в блоге о том, как это сделать. Вы можете прочитать это здесь .

Надеюсь, я смогу помочь!

1 голос
/ 12 октября 2010

Что вы хотите сделать, это создать библиотеку, которая расширяет класс ActiveRecord. Некоторые люди впереди вас:

http://codeigniter.com/wiki/ActiveRecord_Class/

хороших модов в теме, здесь:

http://codeigniter.com/forums/viewthread/101987/

Если вам нужны общие для вашего приложения методы ORM, просто расширьте класс ActiveRecord. Для моего приложения знание структуры таблицы позволяет мне создавать (автоматически генерировать) формы и выполнять другие сопоставления. Я делаю сопоставление API-API, поэтому я включаю метод GetStructure () в MyActiveRecord и строю другие вещи оттуда.

(теперь может произойти смех в RoR)

Редактировать: Хотя я и являюсь поклонником возможностей и мощи Doctrine, я думаю, что спрос на использование командной строки выводит его за рамки CI. Что подходит для вас, то, что подходит для вас, но если я собираюсь использовать Doctrine, я мог бы также использовать Symfony, верно? Или RoR, если на то пошло, верно ?? Видишь, где я гонг с этим? Правильный инструмент для нужного времени.

0 голосов
/ 07 июля 2013

я знаю, что это довольно старая версия, но для тех, кто сейчас использует codeigniter и хочет использовать orm вместе с ней, можно использовать это руководство для интеграции propel с codeigniter

http://llanalewis.blogspot.com/2013/06/installing-propel-in-codeigniter.html

0 голосов
/ 11 января 2013

Я думаю, что php-activerecord - очень хорошая вставная ORM. Я использовал его с Slim Framework несколько раз, и я думаю, что это была бы отличная альтернатива использованию классовой модели CI. Вот пример кода и ссылка:

$post = new Post();
$post->title = 'My first blog post!!';
$post->author_id = 5;
$post->save();

PHP ActiveRecord

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...