【问题标题】:Laravel `model->update($data)` changes pm times to amLaravel `model->update($data)` 将 pm 时间更改为 am
【发布时间】:2016-03-01 16:26:07
【问题描述】:

我的时间似乎正在正确更新,但是当我在我的数据库 (mysql) 中查找该字段时,我看到时间已更改为 AM->update 会发生这种情况,::create 不会发生这种情况

这是我的 $data = Input::all()->update 调用之前

array(14) { ["_method"]=> string(5) "PATCH" 
            ["_token"]=> string(40) "A3OknqVoHtva73nn5HZTBYyFd8v42WOUNlc3ED5G" 
            ["start_time"]=> string(6) "4:30pm" 
            ["end_time"]=> string(6) "5:30pm" 
           } 

这是我的控制器代码。

控制器

public function update($id)
{
    $scheduled_program = ScheduledProgram::findOrFail($id);

    $validator = Validator::make($data = Input::all(), ScheduledProgram::$rules);

    if ($validator->fails())
    {
      return Redirect::back()->withErrors($validator)->withInput()->with('id', $id);
    }

    if($validator->passes()) {
        $scheduled_program->update($data);
        $scheduled_program->save();
        dd($scheduled_program);
    }
}

dd($scheduled_program) 节目

["start_time"]=> string(6) "4:30pm" ["end_time"]=> string(6) "5:30pm"

但在我的数据库中,我看到 AM 值 04:30:00 05:30:00,当我打开显示这些值的页面时,它们是 AM 值。模型似乎正在更新,但它已转换为数据库中的 AM 值。

【问题讨论】:

  • 将“start_time”和“end_time”添加到模型上的 $dates 数组中。然后你必须更新 $data 数组如下 $dates['start_date']=Carbon\Carbon::createFromFormat("g:ia", $dates['start_date']);和 end_date 一样
  • "start_time" 和 "end_time" 已经是我的数据库表中模型和字段的一部分,我是否需要在 "$dates" 中将它们设为数组?我应该把它放在控制器中还是有更好的地方,比如验证器或规则?谢谢!
  • 你必须告诉模型这些需要被视为日期(作为碳实例)。所以你需要将它们添加到模型中的受保护变量 $dates 中(如这里laravel.com/docs/4.2/eloquent#soft-deleting)。当您检索这些时,您将获得 Carbon 对象而不是字符串变量
  • $dates 不适用于我的 time 格式化 str 类型:(

标签: mysql laravel laravel-4


【解决方案1】:

您可以通过使用 Eloquent Accessors 和 Mutators 自动设置或获取正确的格式来解决此问题。

我自动说是因为您不需要直接调用访问器或修改器,但您只需执行以下操作:

 User::find(1)->start_time;

在后台,访问器方法将自动完成它的工作。

查看 Laravel 文档 Eloquent 部分了解详情

https://laravel.com/docs/master/eloquent-mutators

您需要将此添加到您的模型中。

public function setStartTimeAttribute($value) { 
     $this->attributes['start_time'] = date("H:i:s", strtotime($value)); 
 }


 public function getStartTimeAttribute($value) { 
    return date("g:i a", strtotime($value)); 
 }

【讨论】:

  • 谢谢。这解决了我的问题。我在许多不同的模型中有这个时间字段。我需要将此代码放入每个模型中还是有办法一次性完成?
  • 必须把它放在每个模型中,这是使用访问器和修改器的方式
猜你喜欢
  • 2013-09-09
  • 1970-01-01
  • 2011-12-29
  • 1970-01-01
  • 2022-01-19
  • 2018-01-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多