用例
我的用例是我需要验证乒乓球比分。
表格
<input name="data[MatchesPlayer][1][score]" type="number" id="MatchesPlayer1Score">
<input name="data[MatchesPlayer][2][score]" type="number" id="MatchesPlayer2Score">
约束
问题
当cake验证同一模型中的多行时,模型数据将设置为该记录。这意味着无法比较这两个值,因为它们在$this->data
中都不可用。当我使用saveAll()
时,每条记录都会设置为模型,然后在保存之前进行验证。
问题
我想知道是否有一种很好的方法来验证这对数据,而无需在我验证之前将其保存到会话或类似数据中。
答案 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