Какой у вас опыт работы с доктрина? Я никогда не был сторонником ORM, я в основном управлял только базовым слоем абстракции db, таким как adodb.
Но я понял все концепции и преимущества этого. Поэтому, когда появился проект, в котором требовалась ORM, я подумал, что могу попробовать одну из структур ORM.
Мне нужно выбирать между доктриной и продвижением, поэтому я выбираю доктрину, потому что я не хотел выполнять требования phing.
Не знаю, что я сделал не так. Я пришел с правильным мышлением. И я ни в коем случае не «младший» php kiddie. Но я боролся с системой на каждом этапе пути. Документации много, но все кажется немного неорганизованным. А такие простые вещи, как YAML для создания таблицы db, просто не работают и просто срабатывают без ошибок или чего-то еще. Множество других вещей, которые работают немного в стиле фанк, требуют лишь дополнительной настройки перед тем, как приступить к работе.
Может быть, я сделал здесь какое-то мягкое или глупое предположение новичка, что как только я узнаю, что это, у меня будет момент ага. Но теперь я полностью ненавижу систему.
Может быть, есть несколько советов, которые кто-то может дать или, может быть, указать мне на хороший ресурс по этой теме или на какой-нибудь авторитетный сайт / человека по этому поводу? Или, может быть, просто порекомендуете другую структуру ORM, которая «просто работает»?
Ну что ж, в конце концов они наверстали упущенное, просто им потребовалось время.






Я не эксперт в Doctrine - я только начал ее использовать, и я должен признать, что это немного неоднозначный опыт. Он многое для вас делает, но не всегда сразу понятно, как сказать ему сделать то или это.
Например, при попытке использовать файлы YAML с автоматическим обнаружением отношений отношение «многие ко многим» не транслировалось правильно в определение модели php. Никаких ошибок, как вы упомянули, потому что он вообще не рассматривал его как многие-ко-многим.
Я бы сказал, что вам, вероятно, нужно время, чтобы обдумать тот или иной способ ведения дел и то, как элементы взаимодействуют друг с другом. И было бы хорошо иметь время, чтобы делать что-то пошагово, и решать проблемы по очереди в своего рода изоляции. Попытки сделать слишком много за один раз могут быть непосильными и затруднить поиск места, где что-то идет не так.
Я использую Doctrine в проекте среднего размера, где мне приходилось работать с уже существующими базами данных, которыми я не владею. Он дает вам множество встроенных функций, но у меня есть одна серьезная жалоба.
Поскольку мне приходилось генерировать свои модели из баз данных, а не наоборот, мои модели слишком близки к базе данных: поля имеют очень похожие имена на столбцы базы данных, чтобы получить объекты, которые вы должны запрашивать в том, что является важным sql (где поставить этот код и как его протестировать?) и т. д.
В конце концов, мне пришлось написать сложную оболочку для доктрины, которая заставляет меня задаться вопросом, не было бы проще просто использовать старый подход дао / модели и исключить доктрину из поля зрения. Жюри еще не решено. Удачи!
У нас есть существующая база данных, и некоторые из нас хотят использовать doctrine в 2020 году на mysql 5.6 и Windows. Каков твой вердикт сегодня?
мы используем Propel с Symfony 2 года и Doctrine с Symfony более 1 года. Могу сказать, что переход на ORM с фреймворком MVC был лучшим шагом, который мы сделали. Я бы порекомендовал придерживаться Doctrine, хотя на то, чтобы научиться с ней работать, нужно время. В конце концов, вы найдете свой код более читабельным и гибким.
Если вы ищете место, с чего начать, я бы порекомендовал Symfony Jobeet tutorial http://www.symfony-project.org/jobeet/1_4/Doctrine/en/ (главы 3, 6 посвящены основам) и, конечно же, документацию Doctrine.
Как я уже писал выше, мы уже некоторое время используем Doctrine. Чтобы сделать нашу работу более удобной, мы разработали инструмент под названием ORM Designer (www.orm-designer.com), в котором вы можете определить модель БД в графическом пользовательском интерфейсе (больше никаких файлов YAML :-), что, кстати, совсем неплохо. ). Вы также можете найти там несколько полезных руководств.
Отлично для орм-дизайнера. Хотелось бы, чтобы это было бесплатно: D
Это похоже на ответ продавца. «Да, используйте doctrine2, а затем используйте наш собственный ORM Designer», да, это совершенно не предвзято.
Я не проверял ваш инструмент, но я полностью уверен, что наличие графического пользовательского интерфейса для вашей базы данных не заставляет вас действительно знать, что вы делаете. Пользовательский интерфейс подходит для простых задач, таких как управление контентом в cms. Однако для сложных вещей, таких как базы данных, изучите основы и примените их. SQL настолько чистый, простой и понятный. Зачем использовать промежуточное ПО? В какой-то момент он будет хуже оригинала в одном из следующих пунктов: документация, функции, скорость, сообщество.
Мой опыт похож на ваш. Я только начал использовать доктрину и никогда не использовал Propel. Однако я очень разочарован Доктриной. Это ужасная документация. Плохо организовано и довольно неполно.
Аминь, документы заставляют меня выколоть глаза. И сообщество Freenode IRC не очень помогает. Я обнаружил, что, унаследовав проекты, использующие Doctrine, она может стать оружием массового уничтожения в чужих руках.
У меня смешанные чувства. Я мастер SQL только потому, что его так легко проверить. Вы можете быстро тестировать операторы SELECT, пока не получите правильные результаты. А провести рефакторинг совсем несложно.
В Doctorine или любой другой ORM существует так много уровней абстракции, что это почти кажется ОКР (навязчивым / компульсивным). В моем последнем проекте, в котором я опробовал Doctrine, я наткнулся на несколько стен. Мне потребовались дни, чтобы найти решение для чего-то, что, как я знал, я мог бы написать на SQL за считанные минуты. Это так расстраивает.
Я сварливый. Сообщество по SQL ОГРОМНО. Сообщество / поддержка Doctrine незначительна. Конечно, вы могли бы взглянуть на источник и попытаться разобраться в нем ... и это проблемы, на решение которых уйдут дни.
Итог: не пробуйте Doctrine или какой-либо ORM, не запланировав много времени для самостоятельного грокинга.
Если вы можете делать что-то быстрее в SQL, вы можете сделать это с помощью команды Doctrine Native SQL docs.doctrine-project.org/projects/doctrine-orm/en/latest/… и сохранить Doctrine для простых задач.
Propel and Doctrine использует PDO. PDO имеет много открытых ошибок в Oracle Database. Все они связаны с полями CLOB. Помните об этом перед началом нового проекта, если вы работаете с Oracle. Ошибки открыты много лет назад. Doctrine и PDO будут аварийно завершены при работе с Oracle и CLOB
После некоторого исследования различных библиотек ORM для PHP я остановился на PHP ActiveRecord (см. phpactiverecord). Мое решение сводилось к минимальной конфигурации, легкости библиотеки и отсутствию генерации кода. Доктрина просто слишком сильна для того, что мне нужно; то, чего не делает PHP ActiveRecord, я могу реализовать в моем слое оболочки. Я бы посоветовал воспользоваться моментом и изучить ваши требования к ORM и посмотреть, предлагает ли простой, такой как PHP ActiveRecord, то, что вам нужно, или будет лучше реализована домашняя реализация активной записи.
Я думаю, что mtbikemike прекрасно резюмирует это: «Мне потребовалось несколько дней, чтобы найти решение для чего-то, что, как я знал, я мог бы написать на SQL за считанные минуты». Это тоже был мой опыт. SAD (медленная разработка приложений) гарантирована. Не говоря уже об уродливом коде и ограничениях за каждым углом. То, что должно занимать минуты, занимает дни, а то, что обычно было бы более сложным и занимало часы или дни, просто невыполнимо (или не стоит потраченного времени). Получающийся в результате код намного более подробный и загадочный (потому что нам действительно нужен другой язык запросов, DQL, чтобы сделать вещи еще менее удобочитаемыми). Странные ошибки встречаются повсюду, и большую часть времени они проводят, выслеживая их и сталкиваясь с ограничениями и проблемами. Доктрина (я использовал только v2.x) сродни бесполезному упражнению и абсолютно бесполезна. Это, безусловно, самый ненавистный компонент моей нынешней системы и действительно единственный, у которого есть огромные проблемы. Приступая к работе с новой системой, я всегда возвращаюсь от базы данных к классам сущностей, пытаясь выяснить, какое имя является правильным в разных местах кода. Полный кошмар.
Я не вижу ни одного плюса для Doctrine, только минусы. Я не знаю, почему он существует, и каждый день мне хочется, чтобы его не было (по крайней мере, в моих проектах).
Это все еще ваш опыт работы с Doctrine в 2015 году?
плюсы - автоматическая конвертация с SELECT в ваш DomainObject; автоматическая генерация схемы, проверка,
@ Деннис Сомневаюсь. Если он до сих пор пишет для каждой небольшой задачи / сайта вручную - преобразование из базы данных в объект или даже работает только с массивами ... Я действительно сомневаюсь, что он это делает так.
Использование Doctrine 2.5 в 2015 году. Похоже, все шло хорошо. Пока я не захотел использовать две сущности (в JOIN). [теперь лучше после того, как я познакомился с DQL]
Хорошо:
Хорошо:
Плохо
Мне кажется, этот инструмент хорош по идее, но для его правильного выполнения требуется, чтобы разработчик потратил много времени на освоение. У меня возникает соблазн использовать его для генерации объектного SQL, но затем использовать PDO для фактического ввода / вывода. Только потому, что я еще не научился делать внешний ключ и ссылочную целостность с SQL. Но изучение этого кажется намного более простой задачей, чем изучение подробностей Doctrine даже с такими простыми вещами, как сущность, эквивалентная JOIN.
Доктрина в существующих проектах
Я (только начинаю) использовать Doctrine для разработки новых функций в существующем проекте. Поэтому вместо добавления новой таблицы mysql, например, для функции, я добавил сущности (которые создали таблицы для меня с помощью генерации схемы Doctrine). Я оставляю за собой право не использовать Doctrine для существующих таблиц, пока не познакомлюсь с ней лучше.
Если бы я использовал его на существующих таблицах, я бы сначала ... очистил таблицы, что включает в себя:
doctrine orm:validate-schema)Это потому, что Doctrine делает определенные предположения о ваших таблицах. И потому что вы, по сути, собираетесь управлять своими таблицами с помощью кода. Таким образом, ваш код и ваши таблицы должны соответствовать как можно большему соотношению 1: 1. Таким образом, Doctrine не подходит для любых таблиц "произвольной формы" в целом.
Но тогда вы могли бы с некоторой осторожностью и в некоторых случаях уйти с мелочами, такими как дополнительные столбцы, не учитываемые в ваших сущностях (я не думаю, что Doctrine проверяет, если вы этого не попросите). Вам нужно будет построить свои запросы знание, что вам сходит с рук. т.е. когда вы запрашиваете «объект» в целом, Doctrine запрашивает все поля объекта, в частности, по имени столбца. Если ваша фактическая схема содержит больше имен столбцов, я не думаю, что Doctrine будет возражать (это не так, как я подтвердил, создав дополнительный столбец в моей схеме).
Так что да, Doctrine можно использовать, но я бы начал с малого и осторожно. Скорее всего, вам придется преобразовать свои таблицы для поддержки транзакций и для начала иметь суррогатный индекс (первичный ключ). Для таких вещей, как внешние ключи и ссылочная целостность, вам придется работать с Doctrine, чтобы отшлифовать свои сущности и идеально сопоставить их. Возможно, вам придется позволить Doctrine перестроить вашу схему для использования ее собственных имен индексов, чтобы она могла правильно использовать FK и RI. По сути, вы передаете Doctrine некоторый контроль над своими таблицами, поэтому я считаю, что он должен знать схему по-своему (например, иметь возможность использовать свои собственные имена индексов и т. д.).
Вы используете его только для создания новых проектов? Я имею в виду в первую очередь использование Doctrine для создания базы данных. Я спрашиваю, потому что на самом деле я ищу мнения об использовании Doctrine в существующих ("сделанных вручную") базах данных, которые не обязательно правильно сформированы (таблицы без первичного ключа, большие таблицы, которые на самом деле должны быть двумя таблицами, и т.п. ). Насколько подходит Доктрина для такого случая?
Я добавил свой ответ в ответ
Спасибо. Я нахожусь в ситуации, когда я не могу изменить таблицы, к сожалению (мне нужно перенести данные из одной данной БД в другую данную БД с разными схемами). Так что я думаю, что Doctrine - неправильный инструмент. И использование Doctrine только для соединения с БД, но выполнение необработанного SQL приводит к поражению цели Doctrine.
Правда. За исключением необработанного SQL, вы будете выполнять необработанный DQL. (язык, который имеет дело с сущностями, а не с именами столбцов). Вы также можете использовать QueryBuilder для построения ваших запросов. Но да, вы столкнетесь с множеством проблем, особенно если ваши таблицы не поддерживают транзакции. Я вижу возможность использовать Doctrine для таблиц с поддержкой транзакций, где вы используете DQL или QueryBuilder и различные средства Doctrine, такие как параметризованные запросы и так далее. Но вы можете столкнуться с различными небольшими проблемами на каждом этапе процесса, например, с невозможностью управлять базой данных в первую очередь.
Спасибо = +1 за указание на run Doctrine validate tool (doctrine orm:validate-schema)
Использование Doctrine ORM в 2016 году с опытом работы ~ 2 - 2,5 года.
Внутренняя непоследовательность
SELECT i, p
FROM \Entity\Item i
JOIN i.product p
WHERE ...
Предположим, что это Item и Product. Они связаны через Item.product_id с Product.id, а Product содержит Product.model, который мы хотим отображать вместе с Item.
Вот получение того же "product.model" из базы данных с использованием вышеуказанного SQL, но с различными параметрами SQL:
//SELECT i, p
$ret[0]->getProduct()->getModel();
//SELECT i as item, p as product
$ret[0]['item']->getProduct()->getModel();
//SELECT i as item, p.model as model
$ret[0]['model'];
Я хочу сказать следующее:
Структура Output ResultSet может кардинально измениться в зависимости от того, как вы пишете оператор DQL / ORM SELECT..
От массива объектов к массиву ассоциативного массива объектов, к массиву ассоциативного массива, в зависимости от того, как вы хотите SELECT. Представьте, что вам нужно внести изменения в свой SQL, а затем представить, что вам нужно вернуться к своему коду и заново выполнить весь код, связанный с чтением данных из набора результатов. Ой! Ой! Ой! Даже если это несколько строк кода, вы зависите от структуры набора результатов, нет полного стандарта развязки / общего стандарта.
В чем Доктрина хороша
В некотором смысле он устраняет необходимость в SQL, создании и обслуживании ваших собственных таблиц. Это не идеально. Иногда это терпит неудачу, и вам нужно перейти в командную строку MySQL и ввести SQL, чтобы настроить все до такой степени, чтобы Doctrine и вы были довольны, до которой Doctrine рассматривает типы столбцов как допустимые и где вы довольны типами столбцов. Вам не нужно определять свои собственные внешние ключи или индексы, это делается за вас автоматически.
В чем доктрина плохо
Всякий раз, когда вам нужно перевести любой значительно продвинутый SQL в DQL / ORM, вы можете столкнуться с трудностями. Помимо этого, вы также можете иметь дело с несоответствиями, подобными приведенному выше.
Последние мысли
Мне нравится Doctrine за создание / изменение таблиц для меня и за преобразование табличных данных в объекты и их сохранение обратно, а также за использование подготовленных операторов и других сдержек и противовесов, делающих мои данные более безопасными.
Мне нравится ощущение того, что Doctrine заботится о постоянном хранилище из объектно-ориентированного интерфейса PHP. У меня возникает болезненное ощущение, что я могу думать о своих данных как о части моего кода, а ORM позаботится о грязных вещах, связанных с взаимодействием с базой данных. База данных больше похожа на локальную переменную, и я понял, что если вы позаботитесь о своих данных, она вам ответит.
Я ненавижу Doctrine за ее непоследовательность и сложную кривую обучения, а также необходимость искать проприетарный синтаксис для DQL, когда я знаю, как писать что-то на SQL. Знания SQL легко доступны, у DQL нет такого количества экспертов в дикой природе, ни накопленных знаний (по сравнению с SQL), которые помогут вам, когда вы застряли.
к сожалению, в 2017 году я мало использовал Doctrine, хотя она все еще находится в кодовой базе. В основном потому, что мои тесты показали, что MySQLi - это быстрый, а Doctrine - медленный. Моя текущая кодовая база в основном написана с использованием около 1200 операторов чистого SQL, а теперь около 55 операторов Doctrine. Doctrine устраняет сложность в определенных случаях использования, например, мне не нужно отслеживать, что изменилось в моих объектах, когда я их обновляю, Doctrine позаботится об этом, когда я использую flush.
Я создал доступ к MySQL, подобный Doctrine, поэтому почти не имеет значения, какой из них я использую, поскольку синтаксис очень похож, и я могу легко использовать SQL. Итак, я использовал mysqli с моей собственной оболочкой.
Кроме того, большая часть моего SQL имеет от 2 до 6 предложений JOIN и странные крайние случаи, и я не хочу иметь дело с ними в Doctrine. Выполнение их в Doctrine - это «еще одна вещь, которую нужно выучить и поддерживать», и это непросто.
в основном избегая использования Doctrine в 2019/2020, используя MySQLi. У меня все еще есть связанный с Doctrine код, который я использую в некоторых классах репозитория, который все еще существует, но в последнее время не было написано ни одной новой Doctrine.
На данный момент я использую фреймворк Symfony с Doctrine ORM, как насчет использования Doctrine вместе с простыми запросами? Например, из knpuniversity я могу создать собственный метод репозитория, например:
public function countNumberPrintedForCategory(Category $category)
{
$conn = $this->getEntityManager()
->getConnection();
$sql = '
SELECT SUM(fc.numberPrinted) as fortunesPrinted, AVG(fc.numberPrinted) as fortunesAverage, cat.name
FROM fortune_cookie fc
INNER JOIN category cat ON cat.id = fc.category_id
WHERE fc.category_id = :category
';
$stmt = $conn->prepare($sql);
$stmt->execute(array('category' => $category->getId()));
return $stmt->fetch();
... lines 30 - 37
}
Я просто использую Doctrine Entities, например, создание форм обработки, Когда мне нужен более сложный запрос, я просто делаю простой оператор и беру нужные мне значения. В этом примере я также могу передать Entity как переменную и взять ее значения для выполнения запроса. Я думаю, что это решение легко понять, и на создание форм уходит меньше времени, передача данных для них и написание сложных запросов не так сложно, как их написание с помощью Doctrine.
Немного поздно на вечеринку, но позволь мне бросить сюда свои два цента. Я буду подключаться к Laravel, потому что это фреймворк, который я использую.
Laravel и многие другие фреймворки любят Активная запись. Это может быть отличным вариантом для простых приложений и сэкономит ваше время на тривиальное управление БД. Однако с точки зрения ООП это чистый антипаттерн. SoC только что убили. Он создает связь между атрибутами модели и именами столбцов SQL. Ужасно для расширений и будущих обновлений.
По мере роста вашего проекта (и да, так оно и будет!) ActiveRecord будет доставлять все больше и больше боли. Даже не думайте легко обновлять структуру SQL. Помните, что имена столбцов присутствуют во всем коде PHP.
Меня наняли для проекта, цель которого в будущем стать довольно крупным. Я видел пределы ActiveRecord. Я просидел 3 недели и переписал все, используя Data Mapper, который отделяет БД от вышеперечисленных слоев.
Теперь вернемся к Картограф данных и почему я не выбрал Доктрину.
Основная идея Картограф данных заключается в том, что он отделяет вашу базу данных от вашего кода. И это правильный подход с точки зрения ООП. Правила SoC! Я подробно рассмотрел Доктрина, и сразу несколько нюансов не понравились.
$product->save(), просто не годятся. Модель обрабатывает данные, она не должна заботиться о сохранении чего-либо в БД. Это очень тесная связь. Если мы тратим время на создание картографа, то почему бы не иметь $mapper->save($product). По определению, картограф должен знать, как сохранять данные.Такие инструменты, как Doctrine или Eloquent, несомненно, экономят время вначале. Но вот непростой вопрос для каждого индивидуально. Каков правильный компромисс между / временем разработки / будущими обновлениями / ценой / простотой / соблюдением принципов ООП /? В конце концов, вы должны ответить и принять правильное решение.
Мой собственный DataMapper вместо Doctrine
В итоге я разработал свой собственный DataMapper, и я уже использовал его для нескольких своих небольших проектов. Он работает очень красиво, его легко расширять и использовать повторно. В большинстве случаев мы просто настраиваем параметры, и новый код не требуется.
Вот основные принципы:
$model для следующих примеров.$modelMap.$modelMapper->store($model) и все.Мне нравится ваш подробный ответ с абстрактной точки зрения, вместо того, чтобы жаловаться на один вариант использования. Хотели бы вы поделиться своим персонализированным картографом данных? Я очень много вложился в Doctrine, но мне нравится рассматривать альтернативы, и ваше решение звучит интригующе.
@Fodagus Спасибо! Я бы не прочь поделиться им, но я был слишком занят, чтобы сделать его отдельным пакетом на git. Я продолжаю копировать его из одного проекта в другой, что не является хорошим долгосрочным решением :) Я планирую создать пакет git где-нибудь в этом году. Проверьте мой профиль и свяжитесь со мной, я могу поделиться с вами некоторыми идеями и, возможно, еще и кодом.
@PeterMatisko есть какие-нибудь обновления в вашем картографе данных? Спасибо
@reformed, у меня это как отдельный пакет, но пока без особой документации. Свяжитесь со мной по linkedin или по электронной почте, я могу поделиться. У меня есть контакты в Интернете.
Святая корова! Древний наводящий на размышления вопрос с тысячами просмотров и десятком ответов, который НЕ был закрыт толпой Непродуктивных Вопросов !! А ++!