使用 saveMany() 更改多行的字段值

Change field value of multiple rows with saveMany()

我有一个项目模型,类别为:

class Item extends AppModel {
    …
    public $hasAndBelongsToMany = array(
        'Category' =>
            array(
                'className'              => 'Category',
                'joinTable'              => 'categories_items',
                'foreignKey'             => 'item_id',
                'associationForeignKey'  => 'category_id',
                'unique'                 => true,
                'conditions'             => '',
                'fields'                 => '',
                'order'                  => '',
                'limit'                  => '',
                'offset'                 => '',
                'finderQuery'            => '',
                'deleteQuery'            => '',
                'insertQuery'            => ''
            )
    );
    …
}

另一边我也一样,Category。这意味着我有一个名为 CategoriesItems.

的连接 table

我想为所有行更新项目 table 的字段。

    $dataSource = $this->Item->getDataSource();
    $dataSource->begin();
    $items = $this->Item->find('all');
    $i = 1;

    $data = array();
    foreach($items as $item) {
        if($i == $newPosition) {
            $movingItem['Item']['position'] = $newPosition;
            $data[] = $movingItem;
            $i++;
        }
        $item['Item']['position'] = $i;
        $data[] = $item;
        $i++;
    }
    if($this->Item->saveMany($data, array('deep' => true))) {
        $dataSource->commit();
        $this->autoRender = false;
        header("HTTP/1.0 200 OK");
        return true;
    }
    else {
        $dataSource->rollback();
        $this->autoRender = false;
        header("HTTP/1.0 404 Not Found");
        return false;
    }

看来我的数据数组不错。但是当我尝试保存它时,CategoriesItems 行被删除了。

我终于找到了解决方案。

数据需要这样:

$i = 1;
$data = [];
foreach($items as $item) {
    $data[] = ['Item' => ['id' => $item['Item']['id'], 'position' => $i]];
    $i++;
}