За последние 24 часа нас посетили 17634 программиста и 1281 робот. Сейчас ищут 1486 программистов ...

PHP и объекты БД

Тема в разделе "PHP и базы данных", создана пользователем xCRABx, 2 дек 2015.

  1. xCRABx

    xCRABx Активный пользователь

    С нами с:
    17 мар 2011
    Сообщения:
    10
    Симпатии:
    0
    Здравствуйте.
    Недавно сел за большой проект, хочу писать с самого начала хорошо. В проекте использую паттерн MVC, но с БД работаю как обычно: PDO + запросы написанные руками.
    Недавно прочитал о том, что можно представлять таблицы БД в виде объектов(http://www.gamedev.ru/pages/php_height_load/articles/?id=5140), в Java, кстати, используется похожая концепция(только там сущности).
    Стоит ли для каждой таблицы писать свой класс или лучше самому писать запрос в нужном месте(через PDO, конечно).
     
  2. runcore

    runcore Старожил

    С нами с:
    12 окт 2012
    Сообщения:
    3.625
    Симпатии:
    158
    то что ты хочешь называется ORM и есть готовые решения типа propel, doctrine ...
    но можно и свое запилить
     
  3. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.227
    Симпатии:
    1.714
    Адрес:
    Молдова, г.Кишинёв
    да, можно.

    Посмотри doctrine.
    Ещё Yii2, Symfony.
     
  4. xCRABx

    xCRABx Активный пользователь

    С нами с:
    17 мар 2011
    Сообщения:
    10
    Симпатии:
    0
    А в чём преимущества?
     
  5. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.227
    Симпатии:
    1.714
    Адрес:
    Молдова, г.Кишинёв
    xCRABx удобно и в документации описаны варианты использования, не нужно изобретать велосипед
     
  6. runcore

    runcore Старожил

    С нами с:
    12 окт 2012
    Сообщения:
    3.625
    Симпатии:
    158
    преимущества чего? готовых решений?
    в том что они готовые, и не нужно писать самому. К.О.
     
  7. xCRABx

    xCRABx Активный пользователь

    С нами с:
    17 мар 2011
    Сообщения:
    10
    Симпатии:
    0
    Преимущества ORM перед написания запросов руками
     
  8. runcore

    runcore Старожил

    С нами с:
    12 окт 2012
    Сообщения:
    3.625
    Симпатии:
    158
    если он напишет свою ОРМ то там тоже не нужно будет писать запросы руками)
     
  9. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    а я лох. я не юзаю орм.
     
  10. runcore

    runcore Старожил

    С нами с:
    12 окт 2012
    Сообщения:
    3.625
    Симпатии:
    158
    я тоже как-то без ОРМ обхожусь
     
  11. romach

    romach Старожил

    С нами с:
    26 окт 2013
    Сообщения:
    2.904
    Симпатии:
    719
    + удобство: чище код, быстрее писать, удобнее вертеть, связи, логирование / события и прочее.
    - скорость работы, память. Как правило не заметно, но если запросы считаются сотнями-тысячами (какая-нибудь хитрая обработка), то ресурсы потекут рекой )
     
  12. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    ну не. не быстрее. просто иначе.
     
  13. romach

    romach Старожил

    С нами с:
    26 окт 2013
    Сообщения:
    2.904
    Симпатии:
    719
    Ну, к примеру в стандартном ларковском eloquent я прописываю связи, куски запроса, которые можно легко подтянуть к текущему, доп.атрибуты и потом вообще не думаю о sql, гуляя по связям, фильтруя и кастуя хитрую магию.
    Но конечно при этом необходимо понимать в какие запросы к БД всё это преобразуется, дабы не выстрелить себе в ногу )
     
  14. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    У меня не меняются так запросы. Я если один раз написал, то годами запрос не меняется. Какой смысл иметь хитрый инструмент, если гибче текста для таких дел нет ничего априори?
     
  15. romach

    romach Старожил

    С нами с:
    26 окт 2013
    Сообщения:
    2.904
    Симпатии:
    719
    К примеру, если мне нужно получить все заказы пользователя, я просто пишу $user->orders и там будет коллекция со всеми его заказами, а по $order->items - товары из которых он состоит. Благодаря прописанным в модели связям ORM сама скастует нужные запросы. Более того, я могу ещё и дополнительные условия добавить прямо на месте или даже не на месте, а передав объект куда-нибудь, не путаясь потом в правильной последовательности сборки текстового запроса.
    Если мне нужно добавить к заказу товар, я делаю $order->save($item) и оно само воткнет нужные id.
    А теперь представим, что внезапно понадобилось при создании заказа отправить пару писем (клиенту и его манагеру) - я просто беру и вешаю действие на событие.
    Ну или к примеру, при конвертации в json могу сразу преобразовать idшники от справочников в их реальные значения, убрать лишние поля, добавить ещё что-нибудь, дабы не заморачиваться на фронте.
    При чем это не означает, что модель в результате распухнет до невероятных размеров и будет делать то, что к ней вообще не относится, всё это можно растасовать по нужным местам и подключать по необходимости.

    Короче, больше абстракция для бога абстракций )
     
  16. runcore

    runcore Старожил

    С нами с:
    12 окт 2012
    Сообщения:
    3.625
    Симпатии:
    158
    все это можно сделать и без орм
     
  17. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.770
    Адрес:
    :сердА
    До тех пор, пока ПХП будет работать от запроса до запроса, эти ваши ОРМы будут не более чем оверхедом по времени и памяти, не дающими никакого преимущества перед банальными ассоциативными массивами, возвращаемыми по умолчанию.
     
  18. romach

    romach Старожил

    С нами с:
    26 окт 2013
    Сообщения:
    2.904
    Симпатии:
    719
    Я даже за вечер-другой могу накать простенькую ORM с подобным функционалом с нуля. Но зачем?

    Добавлено спустя 29 секунд:
    Пых таки уже может это делать. Только, опять же, зачем?
     
  19. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    ну блин. А как ты программы пишешь, если ты в запросе путаешься?

    Добавлено спустя 52 секунды:
    ОРМ тут не при чем. Складывать методы куда надо и вешаться там можно и нужно в любом случае и без ОРМ.

    Добавлено спустя 49 секунд:
    Не понял о чем ты, расскажи плс.
     
  20. romach

    romach Старожил

    С нами с:
    26 окт 2013
    Сообщения:
    2.904
    Симпатии:
    719
    Да легко. У тебя есть форма фильрации, в ней 10-15-20 параметров, что-то селект, что-то галочка, иногда это поле в той же таблице, иногда в связанной. Фильтры могут добавляться, могут исчезать. А может вообще появиться какая-нибудь хитрая выборка / сортировка со стороны. В какой момент времени ты запутаешься в мешанине условий, особенно если они собираются не в одном месте, а могут навешиваться по ходу дела?
    Вот у тебя есть обертка над mysqli/pdo в которую ты передаешь текстовые запросы, а она там делает подстановки и разбирает результаты, ты её дергаешь в нужных местах, вставляешь-удаляешь-выбираешь. Всё нормально. Теперь тебе нужно реагировать на определенное изменение в определенной таблице. Саму модель менять нельзя, т.к. седня компонент которому нужна эта фича есть, а завтра его уже нет, соотв. куча правок по коду тоже исключена. Как будешь его ловить?

    Фишка в том, что в результате ты либо пишешь свою реализацию всего этого функционала, либо используешь готовую, либо подпираешь код костылями ) Так почему бы сразу не воспользоваться готовым инструментом и не заложить нормальную архитектуру?

    хех, это вообще отдельная тема )

    p.s я не говорю о случаях, когда весь функционал умещается в "вот пост, вот категория к нему, вот пара тегов", тут достаточно пары запросов вручную. Ну или когда тебе нужно разом ковырнуть лям-другой записей в БД, тогда пых падает под тяжестью ООП.
     
  21. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    я не вижу разницы. Ты что так что эдак должен на каком-то языке написать этот запрос. Ты либо на языке ОРМ его пишешь, либо текстом. Какая разница? Где тут можно запутаться?

    Это просто перенос сущностей куда по-дальше. Ты сегодня делаешь этот код для этой задачи там, где ты его пишешь. Завтра он будет не нужен, и тебе всё равно его нужно будет откуда-то убрать или убрать весь код, который это делает. Это раз. Два. Изменение в таблице только тогда изменение, когда она изменилась. Три. Если ты меняешь бд, и тебе надо поменять данные где-то в твоём объекте, то не надо делать это гоняя эти данные в БД и удостоверившись, что они записаны, менять в данных, которые ты до этого выбрал и только тогда выводить на экран... В любом случае более правильно будет выбрать все данные и перерисовать всё заново, а если это не требуется, то видимо просто вернуть "ОК", т.к. на клиенте эти данные всё равно уже есть - они же с него пришли.

    Это какая-то запутанная ситуация, которую я просто решаю иначе, и потому мне не нужна ОРМ видимо.

    Мне чета кажется, что у меня нормальная архитектура. Пришли данные, ты их записал в БД, вернул "ок". Конец. Или. Пришел запрос, ты выбрал данные и отдал. Конец.

    Это в принципе не должно касаться пыха, сколько ты там данных ворошишь. Именно это меня в концепции ОРМ и отталкивает.
     
  22. romach

    romach Старожил

    С нами с:
    26 окт 2013
    Сообщения:
    2.904
    Симпатии:
    719
    У мну смутное подозрение, что мы говорим о разных вещах, но при этом называем их одними словами )
    Пример не абстрактный. У тебя есть модель заказов, они могут появляться и удаляться, у них может меняться статус выполнения, оплаты, доставки и прочее. По сути это и есть события, которые тебе нужно отловить. Не изменение в БД, а изменение согласно бизнес-логики. Да и список событий тем не ограничивается, может быть регистрация покупателей, тикет в службу поддержки и много чего ещё. Потому это не перенос сущностей, а разные сущности.
    Тебе нужно на уже реально работающий функционал навесить обработку этих событий в виде уведомления заинтересованных лиц. Врезаться в работающий код нельзя - ибо нефиг трогать, что и так работает, к тому же не в своей зоне ответственности.
    Дык вот, как ты на основе текстовых запросов поймешь что меняется именно сущность заказов и не просто она, а скажем статус доставки?

    Добавлено спустя 1 минуту 57 секунд:
    Разница в том, что к примеру, на основе объекта запроса ты можешь выстроить целую цепочку его дополнений / изменений, расширять её или наоборот, убирать лишние звенья, не затрагивая всего остального кода )

    Добавлено спустя 1 минуту 12 секунд:
    Это очень даже касается пыха. На большем объеме данных / количестве итераций сборщик мусора говорит всем пока и сваливает )
     
  23. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    Я не вижу связи между записью в бд и событием изменения заказа.
     
  24. romach

    romach Старожил

    С нами с:
    26 окт 2013
    Сообщения:
    2.904
    Симпатии:
    719
    Так и нормальная ORM это не SQL с ООП-синтаксисом. Потому мы друг друга видимо и не понимаем, т.к. я говорю про слой абстракции над данными, а ты о query builder )