Yii2中模型保存后hash字段返回Expression对象而非字符串怎么办?
解决Yii2模型保存后字段返回Expression对象的问题
问题原因
当使用new Expression('MD5(NOW())')为模型字段赋值时,Yii2会将该表达式直接传入SQL语句执行,但不会自动把数据库生成的结果同步回模型属性——模型中仍保留Expression对象,直到下次从数据库重新加载数据。
解决方案
方案1:保存后重新加载模型(最直接)
调用save()后,通过refresh()方法从数据库重新读取最新数据,模型属性会自动更新为数据库存储的字符串:
if ($hashDbCurrent !== $hashDbActual || $currentDateTimeStamp >= $updateDateHashTimeStamp) { $cdbExpression = new Expression('MD5(NOW())'); $mba_info->hash = $cdbExpression; $mba_info->hash_actual = $cdbExpression; $mba_info->last_date_hash_update = $currentDate; if ($mba_info->save()) { // 重新加载模型数据 $mba_info->refresh(); } } return $mba_info;
方案2:PHP端直接生成MD5值(规避数据库表达式)
不依赖数据库的MD5(NOW()),直接在PHP中生成当前时间的MD5字符串,赋值给模型字段:
if ($hashDbCurrent !== $hashDbActual || $currentDateTimeStamp >= $updateDateHashTimeStamp) { $md5Value = md5(date('Y-m-d H:i:s')); // PHP生成当前时间的MD5值 $mba_info->hash = $md5Value; $mba_info->hash_actual = $md5Value; $mba_info->last_date_hash_update = $currentDate; $mba_info->save(); } return $mba_info;
注意:需确保PHP服务器时间与数据库服务器时间一致,否则生成的MD5值会和数据库计算的存在差异。
方案3:通过模型事件自动同步字段
在MbaInfo模型类中添加afterSave事件,保存完成后自动同步数据库实际值到模型属性:
public function afterSave($insert, $changedAttributes) { parent::afterSave($insert, $changedAttributes); // 检测到字段为Expression对象时,重新读取数据库值 if ($this->hash instanceof Expression) { $latestData = $this->findOne($this->primaryKey); $this->hash = $latestData->hash; $this->hash_actual = $latestData->hash_actual; } }
内容的提问来源于stack exchange,提问作者Alex Black
相关产品推荐
相关产品推荐

