在Doctrine 2中对可排序行为进行排序(Symfony 2)

时间:2013-02-04 14:08:01

标签: php symfony doctrine-orm doctrine-extensions

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

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

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

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

2 个答案:

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

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

我希望它能得到解决。

答案 1 :(得分:0)

你可以挂钩一个事件监听器,它将填充SortableMaxAware接口d实体,并从数据库中获取最大值。这当然很麻烦,但嘿,你正在使用ORM :)玩得开心。