我的应用程序架构中有两个表:事件和游戏(一对多)。游戏按日期时间字段排序。但有时可以并行玩游戏(相同的日期时间),但用户应该能够设置其相对顺序。
我以简单的想法添加了innerOrder
(int)字段:它应该具有自动生成的值,可以在重新排序时进行更改(与邻居记录进行交换)。但是我无法使用Doctrine来实现此行为:GeneratedValue
不能两次使用/在单独的字段中使用(只是不能这样工作)。
在下一次尝试中,我尝试不自动生成。但是我在插入时需要一些初始值,例如:MAX(innerOrder)
(更好的是-当然可以自动设置)。
我无法通过prePersist
或类似方法来执行此操作-无法访问存储库类。并且不想在控制器中进行其他查询-不仅因为我每次都要插入其他代码(从表中获取最大值,设置内部顺序),而且我担心可能会发生冲突(当两个用户并行添加游戏)。
我应该如何实现预期的行为(也许,我在这里完全错了)?
答案 0 :(得分:1)
使用Doctrine无需实现此行为,您可以从聚合根管理此值。也就是说,当您将Game
附加到Event
时,可以根据当前附加游戏的最大数量+ 1更新它的innerOrder
值。使用不同类型的{{ 1}}进行编辑(即用学说的写锁或某种共享锁或互斥锁来破坏它)(见symfony / lock)
使用此文档后,您可以指定您的关系确认以给定的顺序获取它
https://www.doctrine-project.org/projects/doctrine-orm/en/2.6/tutorials/ordered-associations.html
答案 1 :(得分:1)
我的两分钱:创建/修改事件时,您可以检查是否已经同时存在一个事件(默认innerOrder为0,或者甚至同时计数(*)事件)。您可以在发生其他事件时发出警告,索要订单,也可以采用表格来手动重新分配事件的顺序。