天天看點

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