2013-02-04 63 views
5

我创建了一个具有Sortable行为的实体,并且有一个关于使用它的问题。
设置和获取位置的方法是不够的我,所以我想要做的简单 为moveUp下移方法与下面的代码:在Doctrine 2中有排序行为的订购实体(Symfony 2)

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

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

有了这个实施为moveUp方法没有限制增加已经是最大位置的物品。 什么是禁止递增这些项目的最佳方法?我听说直接在实体中执行自定义查询不是一个好习惯,所以如何检查该项目是否具有最大值?

回答

0

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

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

我希望这将是固定的。

相关问题