2013-02-04 77 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

我希望這將是固定的。

相關問題