我有一个复选框,重要的是只有第一次单击才能触发操作。在另一个功能中,
if($checkboxModel->value==1 && $checkboxModel->oldAttributes['value']==0)
被称为。
是否可以测试复选框是否曾经被单击过?据我了解,oldAttributes只是当前值之前的最新值,对吧?
oldAttributes
属性用于存储从数据库加载的属性值或存储在数据库中的最后一个值。
假设您在DB中有这样的记录:
id | value
----------
1 | 0
然后oldAttributes
属性将像这样工作:
$model = MyModel::findOne(1);
echo $model->value; //output 0
echo $model->oldAttributes['value']; //output 0
$model->value = 1;
echo $model->value; //output 1
echo $model->oldAttributes['value']; //output 0
$model->value = 2;
echo $model->value; //output 2
echo $model->oldAttributes['value']; //output 0
$model->save();
echo $model->value; //output 2
echo $model->oldAttributes['value']; //output 2
$model->value = 1;
echo $model->value; //output 1
echo $model->oldAttributes['value']; //output 2
oldAttributes
属性不记得记录在某些不同请求中具有的值。
如果要确定操作是否已经执行,则需要在数据库中添加一些额外的字段,您将在其中存储该信息。执行动作时,您将更改该额外字段的值。复选框状态更改后,您将检查extra属性,以查看该动作是否已经执行或现在应该执行。
数据库表可能看起来像这样:
id | value | action_executed
----------------------------
1 | 0 | 0
然后检查您的代码:
if(
$checkboxModel->value==1
&& $checkboxModel->oldAttributes['value']==0
&& $checkboxModel->action_executed == 0
) {
// ... execute action
// update action_executed field
$checkboxModel->action_executed = 1;
$checkboxModel->save(false, ['action_executed']);
//false to turn of validation and the second param to save only that attribute
}