Laravel Accessor Mutator获取/设置日期,小时,分钟

时间:2016-02-01 10:32:37

标签: php laravel-5.1 php-carbon

我的类中有一个名为start_dt的datetime属性。当它被保存时,它需要保存为日期时间,当它被检索时,我需要自己的日期,小时和分钟,以便我可以在表单模型绑定的刀片模板中填充一些字段。相同的表单用于创建和更新。

如上所述,以我需要的格式检索此属性的正确方法是什么,即我需要仅使用start_dt属性的日期部分填充start_dt字段,但如果我们要创建新用户,那么它应该默认到今天的日期。类似地,start_hr和start_min下拉列表需要预先选择小时和分钟(如果是)和更新,如果我们正在创建新用户则需要'00'。

在数据库中,start_dt属性存储为日期时间值,例如2015-11-11 12:38:00。因此,当我们保存时,我需要更新从下拉列表中选择的小时和分钟。你怎么能这样做?

class User extends Model {

    protected $dates = ['start_dt'];

    public function setStartDtAttribute($startDt, $startHr, $startMin)
    {
        $this->attributes['start_dt'] = ;
    }
}


{!! Form::text('start_dt', isset($user->start_dt) ? $user->start_dt->format('d-m-Y') : Carbon::now()->format('d-m-Y'), ['class' => 'form-control']) !!}

{!! Form::select('start_hr', [
   '00' => '00',
   '01' => '01',
   '02' => '02',
    ...
   '23' => '23'], isset($user->start_dt) ? $user->start_dt->hour : '00', ['class' => 'form-control']) !!}

{!! Form::select('start_min', [
   '00' => '00',
   '01' => '01',
   '02' => '02',
    ...
   '59' => '59'], isset($user->start_dt) ? $user->start_dt->hour : '00', ['class' => 'form-control']) !!} 

2 个答案:

答案 0 :(得分:0)

如果您查看文档中的date mutators,他们会举例:

return $user->deleted_at->getTimestamp();  

所以在你的mutator方法中,你可以这样做:

public function getStartDtAttribute($value)
{
    return Carbon::createFromTimestamp($value->getTimestamp());
}

现在你有了一个碳对象,只需使用像$user->startDt->year这样的东西就可以访问年份,月份等。 Check here for the api

要设置新开始日期的当前日期,您可以创建新的日期时间:

...
$user = new User();
$user->startDt = Carbon::now();
...  

或者为了方便起见,您可以在迁移设置中创建默认值。

Schema::table('users', function ($table) {
    ....
    $table->dateTime('start_dt')->default(Carbon::now();
    ....
});

答案 1 :(得分:0)

 public function setStartDtAttribute($startDt, $startHr, $startMin)
 {
   // i guess the $startDt is the column you want to update
    $splitDateTime = explode(" ",$startDt);
    $datePart = explode("-", $splitDateTime[0]);
    $timePart = explode(":", $splitDateTime[1]);

    // i dont understand the $startDT variable but the $startHr 
    // and $startMin i know its the hour and minutes part of the time
    // Now that the string is splitted into array lets replace the  
    // parts that you want to replace

    //index 0 of the $timePart is the hour and 1 is the minutes
    $timePart[0] = $startHr;
    $timePart[1] = $startMin;

    // Now lets join the arrays(ie. $datePart and $timePart) 
    // to form the datetime        

    $datePart = implode("-",$datePart);
    $timePart = implode(":",$timePart);
    $dateTime = $datePart . " " . $timePart

    $this->attributes['start_dt'] = $dateTime;
 }

您可以选择在保存之前将最终字符串转换为DateTime对象。我希望这会对你有所帮助。