Что Doctrine добавляет над активной записью - CodeIgniter? - PullRequest
6 голосов
/ 12 января 2012

Мне действительно нравится Active Record CodeIgniter и насколько хорошо он разрешает все мои запросы к базе данных.

Но я также читал об ОРМ, таких как Доктрина. Когда я читаю документацию Doctrine, кажется, что ее не так легко использовать, как Active Record, и я не вижу, что делает ее лучше (если она есть).

Что Doctrine допускает, что невозможно с Active Record? Doctrine делает ту же работу быстрее, проще, лучше? Или он делает то, что не может сделать Active Record?

Лучше всего, если бы люди могли публиковать примеры задач, показывающих, о чем мы говорим.

Спасибо, Matthew

Ответы [ 2 ]

19 голосов
/ 13 января 2012

Прежде всего, о какой доктрине вы говорите, 1 или 2?
Существует огромная разница.Единственное, что их объединяет, это то, что они оба являются полноценными ORM.В противном случае на самом деле нет никакой связи между ними.

Doctrine 1 основана на ActiveRecords , Doctrine 2 основана на Data mapper pattern.
Обаможет делать одно и то же, но между ними есть некоторые существенные различия.

Вообще говоря, Data Mapper менее «дружественен к разработчикам», но должен иметь лучшую производительность.Зачем?На самом деле это довольно просто.С активными записями каждая сущность знает все «вокруг» себя, отношения с другими сущностями и т. Д. С помощью средства отображения данных сущности тупые и легкие, существует центральная сущность (EntityManager / UnitOfWork в Doctrine2), которая обрабатывает все сопоставления отношений.Таким образом, с точки зрения использования памяти и производительности Data Mapper должен быть быстрее.
Ребята из Doctrine говорят, что Doctrine2 как минимум на 50% быстрее, чем Doctrine1 (есть и другие отличия, а не только шаблон проектирования).

Если вам это нужно, вы даже можете реализовать ActiveRecords поверх картографа данных Doctrine2.Посмотрите на это сообщение в блоге .Я использую этот подход только на этапе разработки, чтобы сохранить как можно меньше кода.Как только он будет запущен в производство, я убью дополнительный слой ActiveRecords и вернусь к средству отображения данных по умолчанию Doctrine2.

Итак, вывод состоит в том, что вы можете делать все с обоими, но точно так же, как вы могли бы сказать, чтоВы можете делать все с сырым SQL.Если вы новичок в мире ORM, я бы предложил использовать ActiveRecords, потому что он прост и (как правило) требует меньше кода.С другой стороны, если вы строите большую, сложную модель, я думаю, что картографирование данных - лучший вариант.

Возможно, я что-то не так понял, но я так понял.

Что касается сравнения между CodeIgniters ActiveRecords и Doctrine (1 или 2), я не могу сказать, потому что я никогда не использовал CodeIgniter.В одном я уверен, что Doctrine имеет гораздо больше возможностей, чем ORM CodeIgniters по умолчанию.Например: гидратация результатов, наследование (отдельная таблица, таблица классов), предварительная выборка, отложенная загрузка, дополнительная отложенная загрузка, расширения, поведение, оптимизация, прокси, обработка даты и времени ... Это массивный и полноценный ORM с большим количествомВ то время как мой опыт работы с любым «фреймворком по умолчанию ORM» заключается в том, что их основная цель - быть максимально простым, чтобы новичок мог легко освоить его.Doctrine - могучий зверь, и он может многое сделать более эффективным и / или логически более правильным способом, чем встроенный в CodeIgniter ORM.Недостатком является то, что для изучения и написания кода требуется больше времени, и это огромная библиотека с тысячами файлов, поэтому простое выполнение работы приводит к дополнительным издержкам по сравнению с более легкой альтернативой.

9 голосов
/ 12 января 2012

Doctrine - это полноценный ORM, который реализует шаблон активной записи.Класс активных записей CodeIgniter - это построитель запросов / оболочка базы данных, основанная на «измененной» версии шаблона.

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

Используя класс активной записи CodeIgniter, вы можете реализовать такую ​​модель:

class User_model extends CI_Model
{

    public function get_user_by_username($username)
    {
        // Build query using active record methods
        $this->db->where('username', $username);
        $this->db->where('active', 1);

        // Execute query
        $query = $this->db->get('users');

        // Return results
        return $query->result();
    }

    // ...

}

Вы в основном строите запрос, используя методы активной записи.Легко увидеть, как каждый метод (where(), get() и т. Д.) Сопоставляется с необработанным SQL.Преимущество использования методов активной записи по сравнению с $this->db->query() заключается в том, что CodeIgniter компилирует каждый запрос на основе используемого вами драйвера базы данных.Помимо этого, активная реализация записи CodeIgniter на самом деле мало что делает.Любые запросы вам нужно будет создать.Я надеюсь, что проиллюстрировал, как методы активной записи похожи на построитель запросов.

Обратите внимание, что следующий пример кода может быть неправильным.Используя Doctrine, у вас может быть такая модель:

/** @Entity */
class User
{

    /** @Column(type="integer") */
    private $id;

    /** @Column(length=50) */
    private $username;

    // ...

}

Затем, чтобы использовать модель и связанную функциональность активной записи, вы должны сделать что-то вроде этого:

// Instantiate object
$user = new User();

// Set properties
$user->username = 'some_username';

// Save object
$user->save();

// Access properties
echo $user->id;

Этопросто царапать поверхность с точки зрения того, что может сделать Доктрина.Вы можете установить значения по умолчанию для свойств или указать отношения между таблицами.Обратите внимание, что я не написал ни SQL, ни построил запрос.Я просто установил свойства объекта, а затем сохранил его.Doctrine позаботится обо всем остальном.

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

Использование Doctrine аналогично CakePHP илиРеализация шаблона активной записи в Ruby on Rails.Вы можете взглянуть туда для дополнительного понимания схемы.Примеры CakePHP могут быть особенно легко усвоены, если вы исходите из фона CodeIgniter.

Чтобы ответить на некоторые другие ваши вопросы, я не думаю, что есть что-то, что делает Doctrine лучше, чем методы активной записи CodeIgniter.Он может быть более продвинутым, но, как и любая другая библиотека, вы хотите выбрать лучший инструмент для работы.Если вы довольны активными методами записи CodeIgniter и не видите необходимости в расширенном ORM, пропустите его.

...