Какую взять ORM для своего проекта?

Не работал раньше с ORM но сейчас думаю время пришло. Мысль такая: взять ORM от любого известного фреймворка, они ведь есть отдельно на гитхабе вроде, установить в свой проект и заюзать.
Тут возникли вопросы:
1) чем отличаются между собой ORM в разных фреймворках
2) какую лучше взять, может быть вообще не фремворковую я понимаю что дело вкуса, но вот какой ваш вкус и почему
  • Вопрос задан
  • 1386 просмотров
Решения вопроса 3
@D3lphi
Возьмем ORM из двух популярных PHP-фреймворков. Первая будет Eloquent ("Родная" для фреймворка Laravel), а вторая - Doctrine (Одна из доступных ORM в фреймворке Symfony). Кардинальным отличием этих двух "систем" является то, что первая разработана на основе паттерна Active Record, а вторая - с использованием паттерна Data mapper. Чем же они отличаются? Приведу абстрактные примеры кода для первого и второго паттерна:

Active Record:
$user = new User(); // Создаем "сущность" нового пользователя.
$user->login = 'D3lph1'; // Устанавливаем его логин равным 'D3lph1'.
$user->password = '123456'; // Устанавливаем пароль этому пользователю.
$user->save(); // Сохраняем пользователя.


Все, новый пользователь создан и находится в базе данных. Теперь, Data mapper:
$user = new User();
$user->login = 'D3lph1'; // Устанавливаем его логин равным 'D3lph1'.
$user->password = '123456'; // Устанавливаем пароль этому пользователю.

$manager = ... // получаем объект менеджера (Например, из DI контейнера).
$manager->persist($user); // "Скармливаем" новоиспеченного пользователя нашему менеджеру.
// $manager->persis($user1); // Мы можем создать еще одного пользователя и уведомить менеджер об этом.
// $manager->persis($user2); // И еще одного...
$manager->flush(); // После выполнения этого метода данные отправятся в базу данных.


Очевидно, первый способ куда проще. Но не все так просто. Дело в том, что паттерн Active Record нарушает принцип единственной ответственности (Single responsibility SOLID). И поэтому, в какой-то степени, может считаться антипаттерном. (Но это ни в коем случае не значит, что его не нужно использовать, для большинства проектов "хватит" за глаза). Наша сущность пользователя делает слишком много. Она не только представляет данные, но и еще работает с ними. В больших проектах это может усложнить поддержку кода. Data mapper, напротив же, разделяет представление данных в сущность (user) и работу с данными (manager, в данном примере. Также, за работу с данными отвечает репозиторий. Вы столкнетесь с ним, как только вам потребуется получить данные из БД (Doctrine)). В небольших проектах вы не заметите особой разницы. Разве что во втором случае увеличится количество классов. Так, в Eloquent вы создаете 1 модель, а в Doctrine - сущность и репозиторий.

Все современные ORM включают в себя также, так называемые, query builder'ы. Они помогают отказаться от языка запросов, такого как SQL. Вы будете составлять запросы таким образом:
$result = $qb
      ->select(['id', 'login'])
      ->where('id', '<>', 3)
      ->get();


Собственно, query builder'ы помогают абстрагироваться от конкретной СУБД. То бишь, вы написали запрос 1 раз, а затем от того, какую СУБД вы используете будет зависеть выходной sql код. Генерация этого кода будет произведена абсолютно прозрачно для вас.

Обе ORM имеют работать с отношениями. Вам нужно будет указать, как таблицы относятся друг к другу, а затем вы сможете удобно обращаться к связанным сущностям.

Теперь конкретно. Так как вы только начинаете осваивать ORM, я бы порекомендовал начать с Eloquent. Она гораздо проще, чем Doctrine, да и более производительная, к тому же. Как освоите Eloquent, смело учитесь работать с Doctrine. Она обязательно должна быть "в копилке" ваших скиллов, так как является самой мощной в "мире" PHP.

Успехов!
Ответ написан
Stalker_RED
@Stalker_RED
Doctrine, потому что
Large Community and integrations with many different frameworks (Symfony, Zend Framework, CodeIgniter, Flow, Lithium and more)

Но для маленького проекта может показаться сложной и лишней.
Ответ написан
dmitriylanets
@dmitriylanets
веб-разработчик
Propel2 ORM (activerecord,migrations,events,more...)
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы