1

因此,我正在开发一个应用程序来处理由一个或多个帐户组成的交易。例如:在沃尔玛购买 100 美元的商品可能有 40 美元来自杂货店账户,60 美元来自家庭账户。

形式大致为:

echo $this->Form->input('Transaction.user_id');
echo $this->Form->input('Transaction.description');
echo $this->Form->input('Transaction.amount');
echo $this->Form->input('AccountTransaction.0.account_id');
echo $this->Form->input('AccountTransaction.0.amount');
.
.
.

可能涉及一项或多项账户交易。此外,AccountTransaction 有一个 transaction_id 字段。

提交表单后,我想:

  1. 检查以确保所有账户交易金额的总和等于交易金额,
  2. 保存交易并获取其 ID
  3. 使用交易 ID 保存账户交易

所以我可以在控制器中轻松地做这些事情,但我想知道是否有一种方法可以在 Transactions 模型中设置验证,以在保存之前检查所有帐户交易是否加起来。

4

2 回答 2

2

我终于意识到无论如何我都可以使用 $this->data 查看所有数据,因此我添加了一个自定义的验证来检查所有提交的内容。我最终得到了一条附加到正确元素的自定义验证消息,并且效果很好:

public function accountsBalance($check) {
    $check = (float) $check['amount'];
    $sum = 0;
    foreach($this->data['AccountTransaction'] as $account) {
        $sum += $account['amount'];
    }
    if ($sum==$check)
        return true;
    $diff = $check-$sum ;
    $message = sprintf("This doesn't match what you entered in your accounts. The total for the accounts is $%0.2f. You're too %s by $%0.2f",
        $sum, $diff > 0 ? "high": "low", abs($diff));
    $this->validator()->getField('amount')
        ->getRule('balance')->message = $message;
    return false;
}

然后对于我的规则:

    public $validate = array(
    'amount' => array(
        'notempty' => array(
            'rule' => array('notempty'),
        ),
        'balance' => array(
            'rule' => array('accountsBalance'),
            'message' => 'The total needs to match your account entries'
        )
    ),
);
于 2012-09-11T18:46:23.833 回答
1

第 1 步 - 使用自定义验证规则

第 2 步 - 忽略 - 假设您的关联正确,这会自动完成

第 3 步 - 使用saveAll()

于 2012-09-10T19:00:22.423 回答