5

我创建了一个具有可排序行为的实体,并且有一个关于使用它的问题。
设置和获取位置的方法对我来说还不够,所以我想 用下面的代码做简单的moveUpmoveDown方法:

public function moveUp() {
    ++$this->position;
}

public function moveDown() {
    if($this->position != 0)
        --$this->position;
}

有了这个实现,moveUp方法对增加已经是最大位置的项目没有限制。禁止增加此类项目的最佳方法是什么?我听说直接在实体中进行自定义查询不是一个好习惯,那么如何检查项目是否已经具有最大值?

4

2 回答 2

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;
}

(在SortableListener:141中)

我想通过设置-1为位置,它将被移动到列表的末尾。并将-2其放在倒数第二位。


编辑:对不起,我回答得太快了,我还想补充:

我认为你不需要自己限制位置,SortableListener意志:

// Set position to max position if it is too big
$newPosition = min(array($this->maxPositions[$hash] + 1, $newPosition));

因此,您的moveUp()功能可能是(顺便说一句,您是否反转了moveUpmoveDown):

public function moveUp()
{
    if ($this->position != 0) {
        $this->position--;
    }
}
public function moveDown()
{
    $this->position++;
}

更新:经过一些测试,事实证明该功能存在错误。

setPosition(-1)会将对象放在列表的末尾,但会在位置上产生间隙。

我在这里转载了它:https ://github.com/l3pp4rd/DoctrineExtensions/pull/908

我希望它会得到修复。

于 2013-11-20T09:39:12.303 回答
0

好吧,您可以连接一个事件侦听器,该侦听器将使用从数据库中获取的最大值填充 SortableMaxAware 接口 d 实体。这当然很麻烦,但是您正在使用 ORM :) 玩得开心。

于 2013-03-06T11:41:02.317 回答