我在我的数据库中创建了一些日期时间字段,正如Laravel文档中所述,我可以“自定义哪些字段会自动变异”。然而,没有示例显示如何完成,也没有任何搜索结果。如何让某些字段自动变异?
例如,我在迁移中创建了一个名为“people”的表,其中一个字段定义为:
class CreatePeopleTable extends Migration {
public function up(){
Schema::create("bookings",function($table){
...
$table->dateTime("birthday");
...
}
}
}
我在模特中为“人”定义了一个模型:
class People extends Eloquent{
//nothing here
}
如果我引用People实例的生日,它将是字符串,而不是DateTime
$one=People::find(1);
var_dump($one->birthday);
//String
日期变更器应该能够将它直接转换为Carbon对象,但是文档并没有说明应该如何实现它。
答案 0 :(得分:17)
在您的People模型中,只需添加此数组:
protected $dates = array('birthday');
Laravel的Model.php internaly将您的字段与默认字段合并为:
/**
* Get the attributes that should be converted to dates.
*
* @return array
*/
public function getDates()
{
$defaults = array(static::CREATED_AT, static::UPDATED_AT, static::DELETED_AT);
return array_merge($this->dates, $defaults);
}
答案 1 :(得分:5)
根据此doc,您可以使用模型成员函数getDates()
来自定义哪些文件自动变异,因此以下示例将返回Carbon实例而不是String:
$one = People::find(1);
var_dump($one->created_at);//created_at is a field mutated by default
//Carbon, which is a subclass of Datetime
但它没有说清楚如何添加自己的字段。我发现getDates()
方法返回一个字符串数组:
$one = People::find(1);
echo $one->getDates();
//["created_at","modified_at"]
所以你可以做的是将字段名称附加到此方法的返回值:
class People extends Eloquent{
public function getDates(){
$res=parent::getDates();
array_push($res,"birthday");
return $res;
}
}
现在birthday
字段将在您调用它时作为Carbon实例返回:
$one = People::find(1);
var_dump($one->birthday);
//Carbon
答案 2 :(得分:3)
你是什么意思:自动变异?
如果您的意思是在从数据库中检索后发生变异,请使用Accessors和Mutators(Laravel docs)。
将此添加到您的模型中:
public function getDateAttribute( $date )
{
// modify $date as you want, example
// $date = new \Carbon\Carbon($date);
// $date->addDay()
// return (string)$date
}
答案 3 :(得分:1)
正如Sasa Tokic所说,将protected $dates = array('birthday');
添加到您的People模型中,如下所示:
class People extends Eloquent{
protected $dates = array('birthday');
}
然后你可以使用Carbon对这个值做一些聪明的事情,如下所示:
$people->birthday->format('jS F Y')
PHP的date()
函数文档(http://uk3.php.net/manual/en/function.date.php)和Carbon的文档(https://github.com/briannesbitt/Carbon)将在这里提供帮助: