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? и как я загружаю модели (свои классы) внутри контроллеров?
Ответы
Ответ 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.
Ответ 3
посмотрите страницу вики-страницы codeigniter для ORM
http://codeigniter.com/wiki/ORM/
Ответ 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