我创建了一个具有Sortable行为的实体,并对使用它有一个疑问 设置和获取位置的方法对我来说还不够,所以我想做的很简单 moveUp 和 moveDown 方法包含以下代码:
public function moveUp() {
++$this->position;
}
public function moveDown() {
if($this->position != 0)
--$this->position;
}
通过此实现, moveUp 方法没有限制增加具有最大位置的项目。 禁止递增此类项目的最佳方法是什么?我听说直接在实体中进行自定义查询不是一个好习惯,那么如何检查项目是否已经具有最大值?
答案 0 :(得分:2)
同样的问题,通过阅读我注意到的代码:
// Compute position if it is negative
if ($newPosition < 0) {
$newPosition += $this->maxPositions[$hash] + 2; // position == -1 => append at end of list
if ($newPosition < 0) $newPosition = 0;
}
我想通过将-1
设置为位置,它将被移动到列表的末尾。 -2
会把它倒数第二。
编辑:抱歉,我回答得太快了,我还想补充一下:
我认为你不需要自己限制位置,SortableListener
会:
// Set position to max position if it is too big
$newPosition = min(array($this->maxPositions[$hash] + 1, $newPosition));
因此,您的moveUp()
功能可能是(顺便说一下,您是否反转moveUp
和moveDown
?):
public function moveUp()
{
if ($this->position != 0) {
$this->position--;
}
}
public function moveDown()
{
$this->position++;
}
更新:经过一些测试后,发现该功能存在错误。
setPosition(-1)
会将对象放在列表的末尾,但会在位置上产生间隙。
我在这里复制了它:https://github.com/l3pp4rd/DoctrineExtensions/pull/908
我希望它能得到解决。
答案 1 :(得分:0)
你可以挂钩一个事件监听器,它将填充SortableMaxAware接口d实体,并从数据库中获取最大值。这当然很麻烦,但嘿,你正在使用ORM :)玩得开心。