0

Active Record 属性与模型类中的属性有何不同?我有一个用户模型,其中有一个来自名为 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));
}

将记录的值保存在数据库中。我不太确定它是 Active Reocrd 事物还是模型,但存储的日期不是用户输入的内容,而是 1970-01-01 Unix 默认值,所以我肯定会做错事。PS我的日期月份和年份在规则中是安全的。验证日期代码

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

1 回答 1

1

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

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

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

还将您的 strtotime 参数更改为:

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

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

上述任何一个问题都可能导致您的代码失败。确保这些是固定的,然后看看它是否有效。

编辑:除非您作为参数传递,否则该save()方法会调用该方法。如果在和之间未设置年、月和日期,则第二次运行验证将删除该属性。validate()falsevalidatesavedob

简而言之,save(false)如果您validate()在脚本的前面使用过,请调用保存。

于 2012-11-04T05:54:20.933 回答