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

WMix

герр M:)ller
Партнер клуба
мне хочется разделить два понятия AR и ORM,
когда я думаю о AR у меня представляется в голове близкий к SQL язык
подобное этому
$this->select()->from()->where()
ну и дополнительные фитчи find, findOne итд..
также мне представляется AR как нечто динамичное не сильно привязанное к структуре базы данных
ORM я представляю больше как нагенеренные наборы классов которые подходят только к этой структуре без любого изменения.
работая на ORM я не думаю о структуре базы но о структуре моделей.
по этой причине хочу ответить что AR не разберется а выполнит ту команду которая написана
$this->update()
в ORM же это звучит $this->save() и она должна разобраться upade это или insert

возможно я ошибаюсь, поправте меня!
 

hell0w0rd

Продвинутый новичок
То что вы описали - обычный queryBuilder, вот ему все равно какие запросы.
ORM - бывают разные, AR - каждый объект самостоятельно выбирает когда делать запросы в базу, в доктрине 2 используется Unit of Work - управляет этими объектами, и сам решает когда сохранить, когда запросить и тд.
 

WMix

герр M:)ller
Партнер клуба
hell0w0rd
если ты увидел только эту запись
PHP:
$this->select()->from()->where()
то это действительно QueryBuilder. я же говорил о том, что при работе с AR разговор о нем имеет место, а при разговоре о ORM таких понятий уже нет, при вызове $this->save() обычно кроме как записывается флажек
PHP:
$this->нужно_записать = true
ничего не происходит.
ORM ждет деструктора и без надобности ничего не делает. но при вызове деструктора записывается новое состояние в базу данных.

когда пишешь
PHP:
$obj = new Row; $obj->id = 5;
опять ничего не произошло но если вдруг ты обратишься на чтение echo $obj->name заработает механизм проверки на существование name в памяти и в случае провала произойдет запрос к базе данных.

по этой причине
PHP:
for($i=0;$i<1000;$i++){ echo $obj->name; }
в ORM практически не замедлит программу. в тоже время
PHP:
 for($i=0;$i<1000;$i++){ mysql_query('SELECT name ..'); }
будет ощутимым
 

Ragazzo

TDD interested
WMix
в "true ORM" вот так писать нельзя:
PHP:
$obj = new Row; $obj->id = 5;
все должно проходить через repository в том числе и получение новой сущности без identity(pk).
 

WMix

герр M:)ller
Партнер клуба
разговор не о синтаксе :)
PHP:
$obj = $ormModel->find(5);
 

hell0w0rd

Продвинутый новичок
WMix
когда я думаю о AR у меня представляется в голове близкий к SQL язык
подобное этому
$this->select()->from()->where()
Я лишь хотел сказать, что в ORM, которая доктрина - для такого предусмотрен аж отдельный тип классов - репозиторий, в котором прописываются запросы, которые невозможно получить стандартными средствами)

Кстати доктрина не ждет деструктора, она как и симфони как-то после отправки ответа умеет выполнять код, я покопался, но так и не нашел как - буду благодарен если кто-то носом ткнет)
 

Ragazzo

TDD interested
WMix
PHP:
$obj = $orm->find(5);
<zanuda_mod>ORM обязана вернуть инстанс сущности/если есть, а не просто создать, т.к. ты ее ищешь по identity (pk) :D </zanuda_mod>
 

keltanas

marty cats
WMix
Здесь кроются ответы на все ваши вопросы.
Замечательная ссылка, которую ты нашел - это очень краткая выжимка по данной книге.
 

WMix

герр M:)ller
Партнер клуба
PHP:
$obj = $orm->find(5); // ничего не произошло кроме как $this->id=5 ждем запрос на чтение
hell0w0rd
когда я думаю о AR у меня представляется в голове близкий к SQL язык == при разговоре о AR я еще думаю о базе данных
 

keltanas

marty cats
WMix
Для того, чтобы программировать, нам удобнее оперировать объектами. Но, сохраняем мы их в реляционную базу данных.
Получается, что мы должны иметь какой-то преобразователь между объектами и таблицами данных.
Подход, при котором требуется сохранять объекты в базу - называется ORM.
Шаблон проектирования, который подсказывает решение для преобразование объектов в данные для таблицы и обратно, называется DataMapper.
Когда мы помещаем функциональность DataMapper в сами объекты, которые хотим сохранить, то получаем подход ActiveRecord. Т.е. объекты представляют из себя записи таблицы, и сами знают, как сохранить себя. Получаются как раз активные записи.

WMix
oh god why, столько понапридумывали названий.
И после этого он себя называет крутым программистом...
 

WMix

герр M:)ller
Партнер клуба
Ragazzo
ткни меня носом, я прочел не увидел волшебную надпись
keltanas
да но не совсем, на уровне AR можно сказать update или insert а на уровне orm таких понятий уже нет я к этому вел. как на самом деле происходит механизм записи зависит от конкретного orm
 

keltanas

marty cats
WMix
ORM - это всего лишь технология, рассказывающая о том, что объекты нужно сохранять в базу, и доставать из базы каким-то образом.
DataMapper, AR - это уже разные подходы, отличающиеся тем, кто занимается сохранением объектов - сторонний класс, или они сами.
Про то, какие там методы используются, уже зависит от конкретной реализации той или иной конкретной ORM. В целом, hell0w0rd справедливо пишет.
Это академические определения по Фаулеру.
Все остальное - это особенности реализации конкретных авторов с их субъективным взглядом на данный вопрос.
 
  • Like
Реакции: WMix
Сверху