Ответы пользователя по тегу Doctrine ORM
  • Как в Doctrine правильно получить связочные данные через 2 HasMany?

    @tukreb
    Так у вас по сущностям и базе соответственно получается, что к адресу может быть доставлено только 1 посылка, а не много :)
    В таком случае никак у вас не получиться сделать. Перепроектируйте БД или связь между сущностями.
    Ответ написан
    Комментировать
  • Composite unique constraint для конкретных значений?

    @tukreb
    Решение, через Partial Unique Index с where
    https://www.postgresql.org/docs/current/indexes-pa...
    Через аннотации в доктрите (Example with partial indexes)
    https://www.doctrine-project.org/projects/doctrine...
    Ответ написан
    Комментировать
  • Невозможно использовть unique-constraints для boolean или как создать partial index?

    @tukreb
    У меня нет ни каких проблем с созданием unique-constraints для boolean.
    https://www.postgresql.org/docs/current/indexes-pa...

    * @ORM\Table(name="table",
     *     uniqueConstraints={
     *          @ORM\UniqueConstraint(name="only_one_true_primaryuix", columns={"id_table", "is_primary"}, options={"where":"is_primary"})
     *  },
     *     indexes={
     *          ///index
     *  })


    Думаю мой рабочий пример, подтолкнёт вас к правильному решению.

    Однако. помните если у доктрины, практически нет ограничений для uniqueConstraints, то вот с композитными ключами PRIMARY KEY ("id_1", "id_2"), у доктрины проблемы и они работаю только в очень примитивном виде и настоятельно рекомендуется заменять их на один первичный ключ и использовать uniqueConstraints для эмуляции композитного ключа.
    Ответ написан
    5 комментариев
  • Ошибка The doctrine/orm package is required when the doctrine.orm config is set как вылечить?

    @tukreb
    Установите symfony/orm-pack в него уже входит всё что нужно в том числе и doctrine/doctrine-bundle
    Ответ написан
    1 комментарий
  • Как задать значение по умолчанию для сущности DOCTRINE ORM?

    @tukreb
    Можно так, через options={"default"="now()"}
    /**
         * @ORM\Column(name="date", type="datetime_immutable", nullable=false, options={"default"="now()"})
         */
        private \DateTimeImmutable $date;

    Точно работает с now(), более сложного не проверял, но я не вижу причин почему не должно сработать. Правда не факт, кто доктрина сможет правильно сгенерировать миграцию, возможно руками придётся править в миграции.
    Ответ написан
    Комментировать
  • Как реализовать Форму создания товара с генератором атрибутов?

    @tukreb
    Дальше отображаете это всё в twig.
    Например можете в twig отправить готовую html код CollectionType формы в html атрибут data-prototype
    <div data-prototype="
    {% apply escape %}
         {{ include('app/template/prototype/collection_form.html.twig', { 'form': form.attributes.vars.prototype }) }}
    {% endapply %}"></div>

    в файле collection_form.html.twig что-то такое:
    {{ form_widget(form.name) }}
    {{ form_widget(form.product) }}
    {{ form_widget(form.attribute) }}

    Далее через javascript вставляете html форму из data-prototype, когда пользователь нажмёт кнопку добавить новый атрибут. При вставке вам нужно будет вручную выставлять индексы новым полям, по дефолту symfony засунет туда что-то вида form[__name__]
    Ну при сохранение, всё будет в виде массива в attributes[]

    Если у вас уже готовые атрибуты в attributes[], то просто через foreach создаёте форму.
    {% for row in form.attributes %}
        {{ form_widget(row.name) }}
        {{ form_widget(row.attribute) }}
    {% endfor %}
    Ответ написан
    Комментировать
  • Как мне создать отношение ManyToOne при джойне к 2 колонкам?

    @tukreb
    Нельзя в Доктрине джойнить сразу по 2 полям одну сущность, если это не ManyToMany (которая в свою очередь не может содержать ничего кроме 2 ID полей, иначе придётся вручную разбивать связь на ManyToOne и выделять отдельные ID).
    У вас уже имеется специальный ID по ним и описывайте связь ManyToOne
    Например
    class Inventory {
        /**
         * @ORM\ManyToOne(targetEntity=Price::class, inversedBy="prices")
         * @ORM\JoinColumns({
         *   @ORM\JoinColumn(name="id_price", referencedColumnName="id")
         * })
         */
        protected $prices;
    }
    Ответ написан
    Комментировать
  • Насколько вредно джойнить таблицы где отсутствует информация?

    @tukreb Автор вопроса
    В общем, пришлось выкинуть пока наследование в доктрине, ну или альтернатива - писать везде через ручные SQL запросы, но тогда доктрину вообще можно выкинуть.
    Потестил как получилось:
    Количество вызываемых полей, через SELECT очень сильно влияет на скорость запроса, даже сильнее чем JOIN и не важно, что там 90% полей пустые.
    Когда нужно вызвать допустим всего 5 полей определённой таблицы, доктрина вызывает 20 и более полей (сотнями может исчисляться), т.к автоматом JOIN всех детей, и увеличивая тем самым задержку с 30мс до 100мс (Docker под Windows) и это только при 3-5 наследоваемых таблицах, а планировалось десятки.
    Если выбрать только 5 полей, но сделать JOIN на все таблицы, как делает Доктрина, то задержка будет всего 50мс, против эталонного 30мс.

    П.С Возможно влияние JOIN будет заметно, при большем количестве таблиц, но при мини тесте поля сильнее повлияли.
    Ответ написан
    Комментировать
  • Как отключить наследование в Doctrine?

    @tukreb Автор вопроса
    В классе Parent
    protected $id;
    переименовал в
    protected $id_parent;

    Забавная ошибка. И как я её должен был диагностировать без метода тыка непонятно, ну да ладно..
    Ответ написан
    Комментировать