Yii Model类列属性不匹配

时间:2012-11-03 12:52:34

标签: activerecord model yii

Active Record属性如何与模型类不同? 我有一个用户模型,其中有一个名为dob的数据库列。我不会从用户那里接受dob作为一个整体因此规则函数将不会有dob但是instaed,'date,month,year'

 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));
}

将记录的值保存在数据库中。我不太确定它是Active Reocrd的东西还是Model,但是日期存储的不是用户输入的,而是1970-01-01 Unix默认,所以我肯定会做错事。 附:我的日期月份和年份在规则上是安全的。 validDate的代码

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');
   }
}

1 个答案:

答案 0 :(得分:1)

确保在模型中定义年,月和日。

public $year;
public $month;
public $date;

如果未定义这些内容,则在大规模分配(或任何分配)期间不会分配它们,并且您的代码(在我的系统上测试)将返回1970-01-01。

同时将您的strtotime参数更改为:

$this->year."-".$this->month."-".$this->date

使用连字符,您可以使用1位或2位数的月份和日期格式。如果没有连字符,则需要使用2位数,但在代码中注明建议您保证。

上述任何一个问题都可能导致您的代码失败。确保它们已修复,然后查看它是否有效。

修改:除非您将save()作为参数传递,否则validate()方法会调用false方法。如果在validatesave之间未设置年,月和日期,则第二轮验证将删除dob属性。

简而言之,如果您在脚本中使用save(false),请致电validate()进行保存。