1

ユースケース
私のユースケースは、卓球のスコアを検証する必要があるというものです。

<input name="data[MatchesPlayer][1][score]" type="number" id="MatchesPlayer1Score">
<input name="data[MatchesPlayer][2][score]" type="number" id="MatchesPlayer2Score">

制約

  • 1つのスコアは11より大きくなければなりません。
  • スコアが11より大きい場合、一方のスコアはもう一方より2ポイント以上でなければなりません。

問題
cakeが同じモデルの複数の行を検証すると、モデルデータがそのレコードに設定されます。これは、2つの値がで使用できないため、2つの値を比較できないことを意味します$this->data。私が使用しているのでsaveAll()、各レコードはモデルに設定され、保存される前に検証されます。

質問
検証する前に、セッションなどに保存せずに、このデータのペアを検証する良い方法があるかどうかを知りたいです。

4

2 に答える 2

1

ここで通常行うことは、saveメソッドのラッパーを作成することです。これにより、モデル コールバックでは不可能なカスタム操作を実行したり、カスタム トランザクションなどを使用したりすることができます。

あなたの場合、それは次のようになります:

class MatchesPlayer extends Model {

    protected $_saveData = null;

    public function updateScore($data) {
        $this->_saveData = $data;
        try {
            // You can use saveAll to validate
            // only, and not actually save
            $saved = $this->saveAll($data, array('validate' => 'only'));
        } catch (Exception $e) {
            // Catch exceptions here in case the
            // saveAll is instead something that throws Exceptions
            // Or your database uses exceptions
            $saved = false;
        }

        $this->_saveData = null;
        return $saved
    }
}

$this->_saveDataその後、モデル全体で使用できます。これを賢く使いたい場合は、 に保存されているすべてのサブモデルを検出し、それらにも を$data設定できます。もちろん、これをメソッドにします。$this->_saveDataAppModel

updateScore()検証が失敗した場合、このメソッドから例外をスローすることができます。検証が失敗した場合に例外をスローする (保存に対して) と、ユーザーにカスタムのフラッシュ メッセージを設定したり、別のステータス コードで応答する API を設定したりすることもできます。

于 2013-01-30T18:24:48.560 に答える