我在 Yii2 中有两个模型(masterTransaction 和 splitTransaction),其中每个 masterTransactions 可以有多个 splitTransactions。每个 splitTransaction 都有一个属性“金额”。我的问题是我需要验证所有“金额”属性的总和是否为 0。
我的第一个解决方案是创建另一个名为 Transaction 的模型,其中我有一个属性,我保存了 masterTransaction 模型的一个实例,另一个属性包含一个 splitTransaction 实例数组。我使用自定义内联验证器进行了验证,效果很好。
交易模式
class Transaction extends Model
{
public $masterTransaction;
public $splitTransactions;
public function init()
{
$this->masterTransaction = new MasterTransaction();
$this->splitTransactions[] = new SplitTransaction();
}
public function rules()
{
return [
['splitTransactions', 'validateSplitTransactions'],
];
}
public function validateSplitTransactions($attribute, $params)
{
$sum = 0;
foreach ($this->$attribute as $transaction) {
$sum = bcadd($sum, $transaction->amount, 3);
}
if ($sum != 0) {
$this->addError($attribute, 'The sum of the entries has to be 0');
}
}
public function save()
{
$this->masterTransaction->save();
foreach ($this->splitTransactions as $splitTransaction) {
$splitTransaction->master_transaction_id = $this->masterTransaction->id;
$splitTransaction->save();
}
}
}
创建模型的控制器函数
public function actionCreate()
{
$transaction = new Transaction();
$count = count(Yii::$app->request->post('SplitTransaction', []));
for ($i = 1; $i < $count; $i++) {
$transaction->splitTransactions[] = new SplitTransaction();
}
if ($transaction->masterTransaction->load(Yii::$app->request->post()) && Model::loadMultiple($transaction->splitTransactions, Yii::$app->request->post())) {
$transaction->masterTransaction->user_id = Yii::$app->user->id;
foreach ($transaction->splitTransactions as $splitTransaction) {
$splitTransaction->user_id = Yii::$app->user->id;
}
if ($transaction->validate()) {
$transaction->save();
}
}
return $this->render('create', [
'transaction' => $transaction,
]);
}
但是当我尝试构建一个表单来输入数据时,我遇到了 Ajax 验证的问题。验证会起作用,但 Yii 不知道将错误消息放在哪里,所以它只是将其删除。
我怀疑这不是 Yii2 对我的数据建模的首选方式,但我真的没有其他想法。也许有人对我有一些想法。