Подтвердить что ты не робот

CodeIgniter, модели и ORM, как с этим бороться?

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

Попробуем объяснить мой вопрос простым примером: у меня есть таблица "автомобиль" с полями "имя" и "цвет". Поэтому я хочу иметь автомобиль класса php, чтобы мой код выглядел в конце концов следующим образом:

$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 (для расширения класса модели 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);
}

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

Не использовать модели CodeIgniter

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

4b9b3361

Ответ 1

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

   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;
        }
    }

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

Ответ 2

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

Ответ 4

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

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

Ответ 5

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

Ответ 6

проверить GAS ORM, это звучит неплохо, удобно и легко. некоторые особенности этой реализации ORM для CodeIgniter:

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

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

Ответ 7

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

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

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

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

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

(Скручивание RoR может теперь отключиться)

Изменить:, в то время как я являюсь поклонником сферы и силы Доктрины, я думаю, что она требует использования командной строки, она выходит за рамки духа CI. Какое право для вас - это то, что вам нужно, но если я собираюсь использовать Доктрину, я могу использовать Symfony, верно? Или RoR, если на то пошло, правильно? Смотрите, где я гонг с этим? Правильный инструмент в нужное время.

Ответ 8

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

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

Ответ 9

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

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

PHP ActiveRecord

Ответ 10

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

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