用于手动排序顺序控制的 Doctrine innerOrder[int] 列实现

Doctrine innerOrder[int] column implementation for manual sort order control

我的应用架构中有两个 table:事件和游戏(一对多)。游戏按日期时间字段排序。但有时可以同时玩游戏(相同日期时间),但用户应该可以设置它们的相对顺序。

我添加了 innerOrder (int) 字段,想法很简单:它应该有自动生成的值,可以在重新订购时更改(与邻居记录交换)。但是我无法用 Doctrine 实现这种行为:GeneratedValue can't be used twice / with separate field (just don't work this way).

在下一次尝试中,我尝试在没有自动生成的情况下进行。但是我在插入时需要一些初始值,例如:MAX(innerOrder)(更好 - 当然自动设置)。

我无法使用 prePersist 或类似方法执行此操作 - 无权访问存储库 class。并且不想在控制器中使用额外的查询来做到这一点 - 不仅因为我每次都应该插入额外的代码(从 table 获取最大值,设置内部顺序),而且我害怕可能发生冲突(当两个用户并行添加游戏时)。

我应该如何实现预期的行为(也许,我在这里完全错了)?

不需要用 Doctrine 来实现这个行为,你可以从聚合根管理这个值。也就是说,当您将 Game 附加到 Event 时,您可以根据当前附加游戏的最大值 + 1 更新它的 innerOrder 值。使用 [= 上的不同类型的锁可以轻松避免冲突11=] 你编辑(即用 doctrine write lock 或某种共享锁或互斥锁(见 symfony/lock))

在它之后,您可以使用此文档指定您的关系确认以按给定顺序获取它

https://www.doctrine-project.org/projects/doctrine-orm/en/2.6/tutorials/ordered-associations.html

我的两分钱:当creating/modifying一个事件时,你可以检查是否已经有一个同时存在(默认innerOrder是0,甚至是同时发生的事件的计数(*))。您可以在有其他事件时发出警告、询问顺序或使用可以手动重新分配事件顺序的表格。