Реализация столбца Doctrine innerOrder [int] для ручного управления порядком сортировки - PullRequest
0 голосов
/ 06 октября 2018

У меня есть две таблицы в схеме моего приложения: Событие и Игра (один ко многим).Игры упорядочены по полю даты и времени.Но иногда могут быть игры, в которые играют параллельно (та же дата и время), но пользователь должен иметь возможность установить их относительный порядок.

Я добавил поле innerOrder (int) с простой идеей: оно должно иметьавтоматически сгенерированное значение, которое можно изменить при повторном заказе (обмен с соседней записью).Но я не могу добиться такого поведения с помощью Doctrine: GeneratedValue нельзя использовать дважды / с отдельным полем (просто так не работает).

При следующей попытке, которую я пытался сделатьэто без автогенерации.Но мне нужно какое-то начальное значение при вставке, например: MAX(innerOrder) (лучше - конечно, для автоматической установки).

Я не могу сделать это в prePersist или аналогичных методах - не имеюдоступ к хранилищу класса.И не хочу делать это с дополнительным запросом в контроллере - не только из-за дополнительного кода, который я должен вставлять каждый раз (получить максимальное значение из таблицы, установить внутренний порядок), но я боюсь возможных конфликтов (когда два пользователядобавление игр параллельно).

Как мне добиться ожидаемого поведения (может быть, я здесь совершенно не прав)?

Ответы [ 2 ]

0 голосов
/ 08 октября 2018

Мои два цента: при создании / изменении события вы можете проверить, есть ли оно уже в одно и то же время (по умолчанию innerOrder равно 0, или даже считать (*) событий в одно и то же время).Вы можете выдать предупреждение, когда есть другое событие, запросить заказ или перейти к форме, в которой вы можете вручную переназначить порядок событий.

0 голосов
/ 07 октября 2018

Нет необходимости в достижении такого поведения с помощью Doctrine, вы можете управлять этим значением из совокупного корня.Т.е. когда вы присоединяете Game к Event, вы можете обновить его innerOrder в соответствии с максимальным количеством прилагаемых в данный момент игр + 1. Конфликтов можно легко избежать с помощью различных типов блокировок на Event, которые вы редактируете (т.е. извлекаетеэто с блокировкой записи доктрины или какими-то общими блокировками или мьютексом (см. symfony / lock))

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

https://www.doctrine -project.org / проекты / доктрина-ОРМ / ы / 2,6 / учебники / упорядоченные associations.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...