Ответы пользователя по тегу Doctrine ORM
  • Как не вываливаться в memory limit при работе с доктриной?

    index0h
    @index0h
    PHP, Golang. https://github.com/index0h
    Попробуйте уменьшить выборки и вставки, по чаще вызывайте очистку энтити менеджера, где это уместно. Запускайте сборщик мусора
    Ответ написан
  • Как в Doctrine выполнить запрос UPDATE JOIN?

    index0h
    @index0h
    PHP, Golang. https://github.com/index0h
    Используйте raw sql и не мучайтесь.
    Ответ написан
    Комментировать
  • Рандомные записи и кеш?

    index0h
    @index0h
    PHP, Golang. https://github.com/index0h
    кэшируете N записей, дальше на стороне php вытягиваете рендомную из них
    Ответ написан
    2 комментария
  • Как в Symfony загрузить DTO в Entity?

    index0h
    @index0h
    PHP, Golang. https://github.com/index0h
    Зря я написал EntityDtoLoader?

    Кто знает, вероятно зря.

    Или как лучше?

    Сложно сказать, пока что я не совсем понимаю, зачем вам в принципе DTO?
    У вас экшн знает какие данные из Request обрабатывать - вытягивайте их явно и проверяйте, да кода больше, но на лонг ране это очень упрощает жизнь, вы явно видите где и что есть.
    Дальше, если нужно запихиваете куда нужно.

    Есть еще вариант - под каждый экшн сделать отдельный класс *Form / *Message, который на вход получает Request, прям в конструкторе вытягивает данные, валидирует их и запихивает к себе в приватные свойства, преобразовав типы. Наружу предоставляются геттеры.
    Ответ написан
    Комментировать
  • Как правильно составить QueryBuilder запрос?

    index0h
    @index0h
    PHP, Golang. https://github.com/index0h
    Вытягивайте отдельными запросами. Иначе в выборку будут попадать пересечения из каждой связи, что может вернуть реально много данных. Да и пагинацию так выйдет проще сделать.
    Ответ написан
    Комментировать
  • Как понять ассоциации OneToMany(двунаправленная, однонаправленная) и OnDelete в Doctrine2?

    index0h
    @index0h
    PHP, Golang. https://github.com/index0h
    В чем отличие однонаправленного ManyToOne и двунаправленного? В чем техническое отличие, ньюансы?


    Пример - говно. У вас по сути идентичные отношения и в первом случае и во втором (со стороны БД). Вероятно имелось ввиду зависимости между вашими entity. Такое действительно можно сделать. Грубо говоря однонаправленная: User знает свой Address. Двунаправленная - User знает свой Address И Address соответствующих ему User знает свой. В БД действительно оба варианта выглядят одинаков. Разница в том, как с ними работает EntityManager.

    Когда и какое выбрать?

    По умолчанию задавать однонаправленную. Если вдруг понадобится - дорисуйте обратную связь.

    Когда для статьи можно выбрать несколько категорий - какая это связь?

    Много статей соответствуют многим категориям.

    Здесь будет 3ья таблица?

    Угу

    Что означает cascade={"persist"}?

    Выполняя EntityManager::persist($myEntityName), для зависимостей $myEntityName каскадом выполнится persist и руками это делать нет необходимости.
    Ответ написан
    Комментировать
  • Как обработать большое количества данных в Symfony без утечки памяти?

    index0h
    @index0h
    PHP, Golang. https://github.com/index0h
    Проверьте, включен ли debug режим, очень похоже на то. Для инсертов я бы на вашем месте транзакцию заюзал на пачки в 1к например. 5кк раз пересчитывать индексы - это очень печально. Если категорий у вас не много - имеет смысл их затащить в память все, а дергать мускуль лишний раз не стоит. Смысла в detach при clear / close нет, от слова совсем.
    Ответ написан
    6 комментариев
  • Doctrine\Common\Collections, как переделать?

    index0h
    @index0h
    PHP, Golang. https://github.com/index0h
    Юзайте интерфейс Collection + docblock.

    /**
     * @return Point[]|Collection
     */
    public function getPoints(): Collection;
    Ответ написан
  • Как правильно сформировать модель?

    index0h
    @index0h
    PHP, Golang. https://github.com/index0h
    Не используйте наследование entity для совего же блага.
    Ответ написан
    Комментировать
  • Как в Symfony Validator обнулить значение поля если оно не валидно?

    index0h
    @index0h
    PHP, Golang. https://github.com/index0h
    Валидатор - валидирует. Вы же хотите и валидировать и мутировать данные, что как бы вообще не правильно. Но если ну очень хочется - да, пишите свое, правда не обзывайте это валидатором
    Ответ написан
    Комментировать
  • Немного вопросов по DoctrineORM и Symfony?

    index0h
    @index0h
    PHP, Golang. https://github.com/index0h
    Я не понимаю зачем, если в php есть __call().

    Магию сложно дебажить, тестировать и поддерживать. Она может потребоваться но в очень-очень узких кейсах, когда по другому никак. Геттеры с сеттерами - это далеко не тот случай, учитывая, что IDE тип PhpStorm их отлично генерирует.

    Ситуация, когда нужно сделать индивидуальную обработку поля - ясна, но зачем в большинстве случаев засорять класс однотипными методами - мне не понятно. В чем смысл?

    За тем, что бы не засорять его никому не нужной магией.

    Я понимаю, что он скорее всего запросит id у объекта, но заче грузить в память целый объект, если я, например, заранее знаю его id?

    При выборке доктрина генерирует прокси классы, которые догружают и гидрируют дочерние объекты в случае необходимости. Хотите чисто id - не объявляйте связь))

    А если я хочу множество адресов переработать, то для каждого грузить его пользователя - странно выходит.

    Почему же? Хотите работать с адресами - работайте с адресами, при чем тут пользователи?

    Как сделать ORM-аннотацию, чтобы поле типа "datetime" заполнялось текущими датой-временем?

    Добавьте значение по умолчанию в конструктор.
    Ответ написан
    Комментировать
  • Если ли смысл в ОРМ для моего случая?

    index0h
    @index0h
    PHP, Golang. https://github.com/index0h
    Есть ли порог когда использование ОРМ становится неоправданым/оправданым? Где он?

    Чаще всего он становится неоправданным из-за слишком высоких накладных расходов.
    Пример:
    User MANY_TO_MANY Group
    User MANY_TO_MANY Category

    Нужно найти все категории, по заданному списку групп пользователей. В случае Doctrine ORM вам придется загрузить список груп, дальше циклом пройтись по всем пользователям (если загрузка ленивая - это куча запросов), дальше уже по всем пользователям пробежаться и вытянуть все категории, плюс убрать дубликаты. Тут лучше plain sql, или query builder, как вам больше нравится.

    В случае же когда, накладные расходы не высоки И ORM будет более удобной - стоит юзать ORM. Например: у вас уже есть загруженный пользователь, хотите достать все его группы. В случае Doctrine ORM это может выглядеть как: $user->getGroups().
    Ответ написан
  • Как в doctrine Entity создать поле, которого нету в таблице и заполнить его?

    index0h
    @index0h
    PHP, Golang. https://github.com/index0h
    конечно можно. не прописываете аннотаций на свойство и все.
    Ответ написан
    7 комментариев
  • Проект со сложной логикой на Symfony – как проектировать? Примеры?

    index0h
    @index0h
    PHP, Golang. https://github.com/index0h
    Как хранить бизнес-логику чтобы модели не превратились в монстров из десятков тысяч строк?

    Тут не совсем модели. Entity - это просто объект данных, умеет хранить их в себе и бросать исключения, если не правильные данные вставляете, все. Repository - умеет работать со своим Entity И БД.

    БЛ находится в классах сервисах.

    Читал про Command Bus где, если правильно понял, на каждое действие в системе – свой класс?

    Вообще под каждое дествие - не обязательно, тут нужно руководствоваться здравым смыслом.

    Как их организуете (их тогда будут сотни)?

    Иерархически. Путь к классу должен быть "понимаем".

    Есть ли смысл выносить каждую доменную модель в модуль/микросервис, хранить всю связанную логику где-то там внутри, а с остальными общаться по внешнему API?

    Только в тому случае, если вы уже делали такие же проекты и в точности знаете максимально точно границы каждого домена. Иначе - не стоит. Делайте монолитную систему, а разделение на микросервисы - только по факту необходимости.

    За ответы в клиентскую часть – отдельный сервис-фронтенд?

    Если в "сервис" вы вкладываете понятие простого класса, умеющего форматировать ответы вашего проекта - мысль здравая.
    Если ответы будут асинхронными (от сервера к другому) - имеет смысл выностить в отдельный клиентский класс.

    Каков оверхед?

    Ничтожный.

    Используют ли такое на практике?

    Да

    Какие подводные камни?

    Следствием серьезной декомпозиции в любом случае будут лишние сущности, чем раньше от них будете избавляться - тем лучше.

    Как не превратить кидание/получение событий типа PostBeforeEdit/PostBeforeEditHandler в "callback hell"?

    Если есть возможность отказаться от событийной модели - часто лучше отказаться.
    Листнеры доктрины конечно штука мощная, но работает не всегда очевидно.

    Функционал "PostBeforeEdit/PostBeforeEditHandler" часто дешевле и проще вынести в сервис, но опять же руководствуйтесь здравым смыслом.

    ACL Где храните указанную логику?

    Если ACL будет не тривиальный - готовьте себя к тому, что он будет размазан по уровню контроллеров.

    Какие структуры для описанного выше – best practice?

    Если есть возможность привести к одноуровневому виду - сделайте. Если с точки зрения бизнеса может потребоваться иерархическая (не фиксированной вложенности) ACL - до последнего убеждайте, что это плохая идея, не повторяйте чужих ошибок.

    В моём понимании это выглядит как куча трёхмерных кубов доступа "crud – group – entity – field", как это сделать более плоским пока только одна идея – делать кучу таблиц many-to-many.

    Гибкая настройка вплоть до каждого поля 90% что не нужна. Если можно свести к понятию скопов прав - сделайте это.
    Структуру можно предлагать только зная ваш проект.

    Версионирование. Как вы версионируете подобные проекты?

    Semver.

    А если нужна "N-1" рабочая версия на продакшене?

    Значит на прод попадает ваша версия с тегом "N-1"))

    Есть ли смысл разделять версии в рамках единой кодовой базы проекта и как (неймспейсы, конфиг, модуль, что-то ещё)?

    Храните яйца в отдельных корзинках. Если модуль развивается полностью отдельно и может быть вынесен как зависимость проекта в vendor - делайте.

    И, самое главное – как всё это совместить?

    • РУКОВОДСТВУЙТЕСЬ ЗДРАВЫМ СМЫСЛОМ
    • Принимаете жесткие соглашения по правилам написания кода, например такие
    • Постарайтесь убедить бизнес в том, что без покрытия кода автотестами будет дороже, нестабильней и дольше. + Пишите тесты. Если объем тестов в 4 раза больше кода, который они тестируют - это норм. У меня бывали случаи, когда для критичного функционала тестов было в ~16 раз больше, чем кода.
    • Жесткие, обязательные кодревью.
    • Если задача крупная - декомпозируйте ее.
    • Технический долг - возвращайте обязательно И как можно скорее.
    • Перед тем как писать код для работы с внешним сервисом - имеет смысл написать его эмулятор.
    • Спешите только в случае серьезных проблем на проде)). Фичи "на вчера" отличаются от фич "на потом" только приоритетом выполнения, более ничем.
    Ответ написан
    6 комментариев
  • Как получить доступ к репозиторию в сущности?

    index0h
    @index0h
    PHP, Golang. https://github.com/index0h
    Как получить доступ к репозиторию в сущности?

    Вы не должны этого хотеть. Это противоречит самому понятию Repository-Entity.
    Репозиторий - работает только с БД и только с этити.
    Энтити - только хранит в себе данные и более ничего.

    Не пытайтесь превратить Repository в ActiveRecord, добром это не закончится.

    Если вам нужны зависимые энтити - тогда пропишите их в аннотациях.

    Если нужно вызывать именно метод репозитория: это делается через DI в сервисах, либо через $this->getDoctrine()->getManager()->getRepository('AppBundle:MyEntityName') в контроллерах.

    Конкретно в вашем примере: вы должны объявить сервис, в который будет насетапливаться EntityManager.
    Ответ написан
    Комментировать
  • Symfony Doctrine, как показать список/настройки всех таблиц?

    index0h
    @index0h
    PHP, Golang. https://github.com/index0h
    Полный список этих моделей (имя класса)

    см. \Doctrine\ORM\EntityManager::getMetadataFactory

    Соответствующая таблица (+ Entity - их может быть несколько)

    там же, где и 1

    Проверить, соответствует ли структура таблицы в базе модели данных, а если не соответствует - то в каких полях есть отличия, отличающиеся ключи и т.п.

    Курим все тот же Metadata

    ну и кнопка пофиксить с предварительным просмотром sql.

    У вас на клавиатуре как раз 105 клавиш под это дело)) Если программист допустил ошибку в схеме БД и не изменили entity под нее - то он же и должен исправить эту ошибку.
    Ответ написан
    Комментировать
  • Как реализовать связь многие-ко-многим для одной и той же таблицы?

    index0h
    @index0h
    PHP, Golang. https://github.com/index0h
    category: [id, name]
    categoryHasCategory: [parentId, childId]

    Только будьте осторожны, такая схема вандало-не-устойчивая и может содержать рекурсивные ссылки.

    Для деревьев все же лучше ONE-TO-MANY

    category: [id, parentId, name]
    Ответ написан
    Комментировать