2

CakePHPには楽観的ロックのサポートがないように思われるので、私はそれを実装する動作を構築することに挑戦しています。動作を少し調べた後、beforeSaveイベントでクエリを実行して、バージョンフィールドが変更されていないことを確認できると思います。

ただし、更新ステートメントのWHERE句をから変更してチェックを実装したいと思います。

WHERE id = ?

WHERE id = ? and version = ?

このようにして、バージョンを読み取ってから更新を実行するまでの間にデータベースレコードを変更する他の要求について心配する必要はありません。また、2回ではなく1回のデータベース呼び出しを実行できることも意味します。

DboSource.update()メソッドが条件をサポートしていることがわかりますがModel.save()、条件を渡すことはありません。

私にはいくつかの選択肢があるようです:

  1. チェックインを行い、beforeSave()防弾ではないという事実を受け入れてください。
  2. CakePHPのローカルコピーをハックして、の配列conditions内のキーをチェックし、それをメソッドに渡します。optionsModel.save()DboSource.update()

現在、私は2番目のオプションに傾倒していますが、それは、他のユーザーが私のハックをフレームワークに適用しない限り、他のユーザーと自分の行動を共有できないことを意味します。

より簡単なオプションを逃したことがありますか?

4

2 に答える 2

10

を使用save()してレコードを更新する場合、Cake はidが存在することを期待し、この を持つレコードのみを更新しますid

あなたが探しているのはupdateAll()

updateAll(array $fields, array $conditions)

1 回の呼び出しで多くのレコードを更新します。更新されるレコードは $conditions 配列で識別され、更新されるフィールドとその値は $fields 配列で識別されます。

たとえば、1 年以上メンバーであるすべてのパン屋を承認するには、更新呼び出しは次のようになります。

$this_year = date('Y-m-d h:i:s', strtotime('-1 year'));

$this->Baker->updateAll(
    array('Baker.approved' => true),
    array('Baker.created <=' => "$this_year")
);
于 2009-09-26T05:23:41.727 に答える
-1

私はCakePHPのローカルコピーをハッキングしました。私は最近、CakePHPの最新バージョンが新しいオプションを提供するかどうかを調べていません。

于 2012-08-08T22:21:19.813 に答える