天天看点

[Laravel]更改日期格式适应DB

想象一下,您的网站上有一些带有日期选择器的日期输入字段。 在交付完整的项目后,客户会返回请求:“顺便说一下,日期格式应为m / d / y”。 各种形式都有很大的变化,是吗?

那么如何在项目一开始就防止这种情况呢? 如何使数据库,日期选择器和所有视图中的日期格式都易于配置?

最大的问题是日期格式在三个地方处理:

  • 数据库应始终为YYYY-MM-DD;
  • Laravel后端:在表单/视图中,我们应该具有客户端想要的任何格式,但是在保存到数据库时应将其转换为YYYY-MM-DD;
  • JavaScript datepicker:日期的JS格式与PHP格式不同,我们将在下面的示例中看到。

那么,如何同步所有这些呢?

首先,让它全部正常运行,然后让它可配置。

JavaScript Datepicker Format

在此示例文章中,我们将以Bootstrap Datepicker为例。

为了使其工作,我们需要以下代码部分:

<link href="https://cdnjs.cloudflare.com/ajax/libs/bootstrap-datetimepicker/4.17.47/css/bootstrap-datetimepicker.min.css" rel="stylesheet" />

...

<script src="https://cdnjs.cloudflare.com/ajax/libs/bootstrap-datetimepicker/4.17.47/js/bootstrap-datetimepicker.min.js"></script>

<script>
$(document).ready(function () {
  $('.date').datetimepicker({
    format: 'MM/DD/YYYY',
    locale: 'en'
  });
</script>      

如您所见,我们传递的格式为MM / DD / YYYY,在PHP Date格式中,该格式为m / d / Y。

结果是这样的:

[Laravel]更改日期格式适应DB

将日期保存到数据库

如果我们将表单数据过帐到某个Controller,则会获得与datepicker完全相同的日期。 而且,如果尝试将其以m / d / Y的形式直接保存到数据库中,则会收到SQL错误。

因此,我们需要将其转换为正确的格式。 我们可以在几个地方做到这一点。

选项1. TransactionController store()方法:

public function store(Request $request)
{
    $data = $request->all();
    $data['transaction_date'] = Carbon::createFromFormat('m/d/Y', $request->transaction_date)->format('Y-m-d');
    $transaction = Transaction::create($data);
}      

这种方法的问题是,您必须在update()方法中执行相同的操作,并且需要在任何地方存储该数据。 这是更灵活的方法。

选项2. Model Mutator app / Transaction.php:

public function setTransactionDateAttribute($value)
{
    $this->attributes['transaction_date'] = Carbon::createFromFormat('m/d/Y', $value)->format('Y-m-d');
}      

在表单/视图中显示日期

好的,我们以Y-m-d格式将日期保存在数据库中。 但是对于用户而言,从视觉上看,它始终应该是m / d / Y。 因此,类似于上面的示例,我们需要在Model上创建访问器。

app/Transaction.php:

public function getTransactionDateAttribute($value)
{
    return Carbon::parse($value)->format('m/d/Y');
}      

使其可配置

对于以上所有示例,我们需要使用config中的值替换确切的格式。

因此,我们将这些变量添加到​​

​config/app.php​

​中:

return [
  'date_format' => 'm/d/Y',
  'date_format_javascript' => 'MM/DD/YYYY',
];      
  • 然后,在Laravel中,我们可以使用以下代码:
Carbon::createFromFormat(config('app.date_format'), $value)->format('Y-m-d');
Carbon::parse($value)->format(config('app.date_format'));      

最后,我们无法在JavaScript中插入变量,但是可以在Blade文件中添加该脚本命令,然后执行以下操作:

$('.date').datetimepicker({
    format: '{{ config('app.date_format_javascript') }}',
    locale: 'en'
  });