如何验证同一模型中的一对值?

时间:2013-01-30 16:59:03

标签: cakephp cakephp-2.0

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

表格

<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()时,每条记录都会设置为模型,然后在保存之前进行验证。

问题
我想知道是否有一种很好的方法来验证这对数据,而无需在我验证之前将其保存到会话或类似数据中。

2 个答案:

答案 0 :(得分: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 - 我会把它设为{{1}当然是方法。

请注意,在验证失败时,您可能希望从此AppModel方法中抛出异常。如果验证失败,则抛出异常 - vs save - 允许您为用户设置自定义Flash消息,或者甚至让api以不同的状态代码响应。

答案 1 :(得分:-1)

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