我创建了一个具有Sortable行为的实体,并对使用它有一个问题。
设置和获取职位的方法对我来说还不够,所以我想做简单
moveUp moveDown 方法,其代码如下:

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

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

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

最佳答案

在这里,通过阅读代码,我发现了同样的问题:

// 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

我希望它将得到解决。

09-30 16:45
查看更多