我创建了一个具有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()
函数可能是(顺便说一句,您是否反转了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
我希望它将得到解决。