2

要素の位置を更新するためのこの小さなコードがあります

public function moveUp($id) {

        $row = $this->find($id)->current();

        $kategoria = $row->kategoria;
        $position = $row->position;

        if($position > 1) {

            $data1 = array(
                    'position'  => new Zend_Db_Expr('position - 1')
                );
            $where1['id = ?'] = $id;

            $this->getDefaultAdapter()->update($this->_name, $data1, $where1);  

            $data2 = array(
                    'position'  => new Zend_Db_Expr('position + 1')
                );

            $where2['position = ?'] = $position - 1;
            $where2['kategoria = ?'] = $kategoria;  

            $this->getDefaultAdapter()->update($this->_name, $data2, $where2);

        }
    }

問題は、2番目の更新のみが実行され、最初の更新は何も実行しないことです。2番目の更新をコメントアウトすると、最初の更新は正常に機能します。何故ですか?

また、+ /-1だけでなく、次に小さい/大きい位置を確認する必要がありますか?これは、アプリケーションの他の部分のコードが位置列にギャップを作らないことを前提としています。

4

1 に答える 1

2

わかりました。最初の更新後、両方の行が同じpositionであるため、2 回目の更新は 1 つではなく両方の行に影響します。

追加して修正しました

$where2['id != ?'] = $id;  
于 2012-09-13T13:33:34.350 に答える