Activerecord Yii模型类列属性不匹配

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

活动记录属性与模型类中的属性有何不同? 我有一个用户模型,其中数据库中有一列名为dob。我不会从用户那里接受dob作为一个整体,因此规则功能不会与dob有任何关联,而是安装“日期、月份、年份”

 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
字段。是。你说得对,这是第二次了。因此,删除。