1

用例
我的用例是我需要验证乒乓球得分。

形式

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

约束

  • 一个分数必须大于 11。
  • 如果分数高于 11,则一个分数必须是 2 分或高于另一个分数。

问题
当 cake 验证来自同一模型的多行时,模型数据被设置为该记录。这意味着无法比较这两个值,因为它们在$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->_saveData也设置它们——我当然会把它作为一种AppModel方法。

updateScore()请注意,当验证失败时,您可能希望从此方法抛出异常。如果验证失败抛出异常 - 与保存 - 将允许您为用户设置自定义闪存消息,甚至有一个以不同状态代码响应的 api。

于 2013-01-30T18:24:48.560 回答
-1

在 MatchesPlayer 模型中使用自定义验证规则,请查看 http://book.cakephp.org/2.0/en/models/data-validation.html#adding-your-own-validation-methods

于 2013-02-01T10:11:57.630 回答