AR, ORM, Query Builder - хочется разобраться

hell0w0rd

Продвинутый новичок
возможно так тема звучит непонятно нужно знать как родился этот топик
У доктрины 1 был AR - сейчас UoW.
И по поводу билдеров запросов - еще раз, есть вещи которые невозможно запросить с помощью ORM. Такие вещи делаются с помощью кверибилдера. Но доктрина, не знаю как другие, при правильно составленном сложном запросе ответ распарсит на нужные объекты - и это очень удобно)
 

keltanas

marty cats
возможно так тема звучит непонятно нужно знать как родился этот топик
Другими словами, доктрина2 - это не AR. Она работает по другому принципу.
В ней мы берем объект (из базы или новый) и говорим, что его надо будет сохранить (но на самом деле не сохраняем).
Когда мы так отметим все необходимые объекты, то говорим, что нужно выполнить сохранение. Тогда запускается транзакция и выполняется сохранение или добавление.
PHP:
$em = $this->getDoctrine()->getManager();
$t1 = $r->find(33);
$t2 = $r->find(34);

$t1->setId(35);

$t1->setUpdatedAtValue();
$em->persist($t1);
$t2->setUpdatedAtValue();
$em->persist($t2);

$em->flush(); // <- real saving
Т.о. мы сокращаем время работы транзакции до минимума и в нее у нас не попадают всякие select (что могло бы быть, если бы мы запускали транзакцию в начале работы скрипта).
На всякие $obj->setId() доктрина не купится и просто проигнорирует.
По поводу insert или update - доктрина мониторит статус объекта (новый, из базы) и в зависимости от него принимает решение.
Подробнее можно посмотреть тут.
 

Absinthe

жожо
WMix
Здесь кроются ответы на все ваши вопросы.
Где эту книгу можно получить в PDF?
Даже на английском не нашел - только конвертированную с chm версию без индекса и с кучей мусора из chm. А купить можно только в .mobi, для которого нет нормальных читалок.
Книга-призрак.
 

Gas

может по одной?
Ragazzo
насчёт симфони с доктриной я почти во всём согласен, это же и зенда2 касается, но есть же сегмент где они востребованы, большим компаниям надо показать что всё круто и ентерпрайз.
а проекты от 5+ человеко/лет без Di головного мозга наверное вооще тяжко впоследствии сопровождать, там где в небольших проектах он кажется оверхед'ом, в крупных плюсами выливается.

keltanas
а сравнивать симфони и yii, смысла мало, слишком они разные и разными путями идут, и доктрину (data mapper) и ar yii-шный тоже сранивать смысла нет.
yii делается скорее с оглядкой на rails, нежели на другие php фреймворки.
 

hell0w0rd

Продвинутый новичок
Забавно) Ragazzo, ты устроил из темы бардак, переход на личности, но не обсуждение) Троллить конечно хорошо, но когда от этого есть смысл
доктрина является самой популярной ORM - что не так, где в доктрине оверхед?
Паттерны - не обманывайте себя, используется один и повсеместно, имя ему синглтон
По поводу сторонних компонентов Sam Dark сказал что попробует вроде, доктрину ту же)
 

WMix

герр M:)ller
Партнер клуба
я не правильно понимаю ActiveRecord, для меня она звучит как часть ORM (одна из сущьностей), читая вас задумался что маппер и запись это две разные по сути технологии (правильно?) , а в какое слово обьеденит их в одну технологию, или это два различных подхода использованья обьектов скрывая хранилище (и в чем отличия)?
Паттерны - не обманывайте себя, используется один и повсеместно, имя ему синглтон
кажись перегибаешь
 
  • Like
Реакции: AmdY

Gas

может по одной?
WMix
ORM - это название подхода, а не конкретной реализации. Популярные реализации это:

ActiveRecord:

PHP:
class User extends ActiveRecord
{
}
$user = User::find(10);
$user->name = 'WMix';
$user->save();
http://laravel.com/docs/database/eloquent
http://www.yiiframework.com/doc/guide/1.1/en/database.ar

и DataMapper

(псевдокод)

PHP:
class User
{
    protected $name;
}
$entityManager = new EntityManager;
$user = $entityManager->find('User', 10);
$user->name = 'WMix';
$entityManager->save();
http://docs.doctrine-project.org/en/latest/tutorials/getting-started.html

Разница в том, что в AR сущности наследуются от некоего класса, который умеет находить объекты, сохранять, удалять и т.д.
У датамаппера сущности отделены, они ничего не знают о хранилище, а всеми манипуляциями занимаются сторонние объекты - entity менеджеры.
AR проще в использовании, но получается что смешивается логика самой сущности с логикой хранилища.
 

Ragazzo

TDD interested
Gas
у симфонистов нехило припекло ходят щас как макаки :D
большим компаниям надо показать что всё круто и ентерпрайз.
так и есть, так и есть ;) там же есть отдельно и софтваре-архитекторы, и домен-эксперты, и обычные программисты, там и нужно как раз DDD и многое из него, в том числе и storyBDD там нужно для взаимодействия и "разговоров" между друг другом всех этих 3х типов людей, иначе без обратной связи мало что получиться качественного.
 

ksnk

прохожий
WMix
Что то так и не появилось ясности в этом вопросе. AR - это просто хелпер для работы с базой данных. Примерную схему хранения данных он позволяет отвязать от физических особенностей конкретного SQL или noSQL языка описания. Ввиду недостаточного знакомства с предметной областью, не вижу AR способного работать одновременно эффективно с noSql(mongoDb) и SQL базами, возможно, кто-то видит
ORM - это просто прослойка между моделью данных и конкретной реализацией хранения данных. "Подходящий к задаче" ORM организован так, чтобы работа модели(в терминах MVC) заключалась в использовании одного метода ORM на операцию.
 

hell0w0rd

Продвинутый новичок
разраз111!!! ORM - это технология, AR - один из паттернов ее реализации. ORM - когда база данных предоставляется в виде объектов, где каждая строка - объект. Таким образом если у таблицы есть связь с другой таблицей - в зависимости от типа связи у одного из объектов (или у обоих) одно из полей указывает на другое. И так далее и тому подобное.

Отличие AR от доктрины(в ней судя по всему несколько паттернов живет) в том, что в AR - каждый объект сам управляет сохранением своего состояния от одного запроса до другого. В доктрине же сущности не знают что они сущности. Они просто объекты. Зато entity manager знает что у такого-то объекта есть такое-то представление в БД, и потому в AR управление выглядит так:
PHP:
$obj->save();
А в доктрине так:
PHP:
$em->persist($obj);
$em->flush()
 

keltanas

marty cats
ksnk
Начни читать с начала.

ORM (англ. Object-relational mapping, рус. Объектно-реляционное отображение) — технология программирования, которая связывает базы данных с концепциями объектно-ориентированных языков программирования, создавая «виртуальную объектную базу данных».

AR и DataMapper - это конкретные реазлизации ORM.

Что касается NoSQL баз данных, то тут не корректно говорить о ORM в их конексте, т.к. они не являются реляционными БД. С другой стороны Переложить концепцию на NoSQL можно.
Тогда останутся те же DM и AR, только в рамках ODM (Object-document mapping). Что по идее, носит чисто условных характер.

Все дело в том, что классически определения DM и AR были даны 10 лет назад (или еще раньше в кулуарах), когда NoSQL не были в моде. Но, необходимость конвертировать данные между программой и базой осталась.
 

ksnk

прохожий
Все дело в том, что классически определения DM и AR были даны 10 лет назад
И какой смысл вообще использовать определения, который уже успели устареть? Ладно, наверное допустимо использовать их для демонстрации и описания ситуаций, в качестве всем понятных терминов, но ведь оно явно переводится в код. Код который просто по устаревшему определению!!! не может эффективно работать с noSQL.

Возьмем типовой, в моем понимании, проект. У него есть mysql база для хранения всего-всего с админкой и обученым персоналом. У него также есть частичный дубль данных в Sphinx или Mongo базе для поиска и блекджека. Должен ли я иметь ДВА ORM в этом случае, и накой? Какая примерная схема классов php может быть?
 

Absinthe

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

Код который просто по устаревшему определению!!! не может эффективно работать с noSQL.
Может дело в том, что просто ты сильно наговнокодил, вот тебе и результат не нравится?

Должен ли я иметь ДВА ORM в этом случае, и накой?
По твоему желанию. Можно и один. Зависит от реализации.

Какая примерная схема классов php может быть?
Обычная. Им нет дела до того, как будет работать, к примеру, меппер. Часть классов он пишет в мускул, часть в монго.
 

ksnk

прохожий
keltanas если начинать читать с начала, я натыкаюсь на фразу
мне хочется разделить два понятия AR и ORM,
. Мне тоже хочется их разделить. В меру моего понимания разделения абстракций работы с данными. Тебе, насколько я понял, непонятно само желание разделять вещи, которые представляют собой (в меру твоего понимания терминов ORM и AR) одно и то же.
 

ksnk

прохожий
Absinthe
Вероятно, имеет место терминологическая путаница. Нужно договорится о терминах и их привязке к хотелкам топпикстартера.
 

keltanas

marty cats
ksnk
Как ты представляешь себе отделение жигулей от машин? Или куриц от птиц? Или .... AR от ORM...
Я в нескольких постах пытался объяснить, что это не сравнимые понятия... Зачем ты все еще упираешься?
Чтобы наполнить чашу, чаша должна быть пуста. Так вот опустоши чашу, а потом наполни ;).
И какой смысл вообще использовать определения, который уже успели устареть?
Ну, книга Эриха Гаммы и остальных была издана в 95ом, однако никто не может сказать, что она устарела.
Нужно договорится о терминах и их привязке к хотелкам топпикстартера.
О терминах уже все давно договорились. А вот к хотелкам ТС их лучше не привязывать, ибо это внесет дополнительную путаницу.
Термины надо просто принять и использовать.
 

ksnk

прохожий
keltanas Вероятно, я недостаточно ясно сказал, что не понимал, что ORM это AR, но в более конкретных выражениях. Мне (и TC на старте топика, а если поковыряться в топике-предшественнике, и не только ему ;) ) под ORM хотелось понимать более высокий уровень абстракции, но, к сожалению, Фаулер уже успел застолбить эту аббревиатуру. Более того, он довольно крепко повязал его на реляционную модель данных, что сделало ее "ограниченно применимой" (я назвал это устаревшей) для моих проектов с одновременным хранением данных в реляционной и нереляционной базе.
Надеюсь, сейчас непоняток стало меньше?
 

Absinthe

жожо
Более того, он довольно крепко повязал его на реляционную модель данных, что сделало ее "ограниченно применимой" (я назвал это устаревшей) для моих проектов с одновременным хранением данных в реляционной и нереляционной базе.
Я так не думаю.
Никто не запрещает использовать ORM с nosql, никто не запрещает часть сущностей сохранять в mongo, часть в mysql.
 
Сверху