Activerecord Yii模型类列属性不匹配
活动记录属性与模型类中的属性有何不同? 我有一个用户模型,其中数据库中有一列名为dob。我不会从用户那里接受dob作为一个整体,因此规则功能不会与dob有任何关联,而是安装“日期、月份、年份”Activerecord Yii模型类列属性不匹配,activerecord,model,yii,Activerecord,Model,Yii,活动记录属性与模型类中的属性有何不同? 我有一个用户模型,其中数据库中有一列名为dob。我不会从用户那里接受dob作为一个整体,因此规则功能不会与dob有任何关联,而是安装“日期、月份、年份” array('date, month, year', 'validDate'), 我正在这样做 public function afterValidate() { parent::afterValidate(); $this->date_of_birth = date("Y-m-d", strt
array('date, month, year', 'validDate'),
我正在这样做
public function afterValidate()
{
parent::afterValidate();
$this->date_of_birth = date("Y-m-d", strtotime($this->year."".$this->month."".$this->date));
}
将记录的值保存在数据库中。我不太确定它是否是活动的Reocrd对象或模型,但存储的日期不是用户输入的日期,而是1970-01-01 Unix默认值,因此我肯定会出错。
顺便说一下,我的日期、月份和年份在规则中是安全的。
有效期代码
public function validDate($attributes, $params)
{
if($this->scenario == 'registration-general')
{
if($this->month == 0)
$this->addError('month','Month cannot be blank');
elseif(0 > $this->month || $this->month > 12)
$this->addError('month','Enter a valid month');
}
}
确保在模型中定义年、月和日期
public $year;
public $month;
public $date;
如果这些没有定义,它们在大规模分配(或任何分配)期间都不会被分配,您的代码(在我的系统上测试)将返回1970-01-01
同时将strotime参数更改为:
$this->year."-".$this->month."-".$this->date
使用连字符,您可以使用1位或2位的月份和日期格式。如果没有连字符,您需要使用2位数字,但代码中的注释表明您可以保证这一点
上述任一问题都可能导致代码失败。确保这些是固定的,然后看看它是否工作
编辑:除非将false
作为参数传递,否则save()
方法调用validate()
方法。如果在validate
和save
之间未设置年、月和日期,则第二次运行validate将删除dob
属性
简而言之,如果您在脚本前面使用了
validate()
,请调用save(false)
进行保存。是否也有关于出生日期的规则?validDate是你自己的验证器吗?请输入完整的验证规则,validDate是我自己的验证函数。没有关于出生日期的规定。它只是不存在于规则函数中。所有三个变量都在模型中赋值。它保持不变,即值在下一步中保留,但在第三步中显示,在第三步中,我对用户对象调用save()。然后错误可能出现在您忽略的其他地方。提供更多的代码会有所帮助。您说您的数据库列名为dob
,但您正在将字符串分配给名为date\u of_birth
的属性,这可能是问题所在吗?输入错误,对不起,这两个位置都是dob。但如果是这样的话,是的,这将是一个问题,以防有人读到这篇文章。名字必须相同。代码有$transaction=Yii::app()->db->beginTransaction();在第3步提交数据,我的dob在第3步有空白值,但在第2步有正确值。数据丢失,因为日期、月份、年份不被视为用户模型的属性。我肯定那里出了什么问题。我应该提供什么代码,我的用户模型?包括任何与保存过程相关的内容,这样我们就可以知道问题出在哪里了。这包括控制器操作,以及用户模型的任何相关部分(beforeSave
、save
、afterSave
,等等)。特别是包含事务的任何代码。如果您之前已经在某个时间点调用了$user->validate()
,请尝试调用$user->save(false)
以停用验证。如果您的年、月、日期变量以某种方式被清空,那么第二次调用validate(在调用save()
而不使用参数时发生的情况)也会删除dob
字段。是。你说得对,这是第二次了。因此,删除。