2017-04-24 234 views
0

我遇到麻煩了解Laravel如何處理日期和碳。我有一個模型,它有一個名爲published_at(它是da DATE字段)的特殊字段。我希望laravel在保存實例對象時使用碳轉換該字段。Laravel 5:在數據庫中設置或獲取日期格式

這是我的模型:

<?php 

namespace App; 

use Carbon\Carbon; 
use Illuminate\Database\Eloquent\Model; 


class Addon extends Model 
{ 

// ... 

protected $dates = [ 

    'published_at' 
]; 

// .... 

/** 
* Set the published_at date format 
* 
* @param $date 
* @return string 
*/ 
public function setPublishedAtAttribute($date) 
{ 
    $this->attributes['published_at'] = Carbon::createFromFormat('d/m/Y', $date); 
} 

// .... 
} 

所以,我的理解,published_at場現在應該保存爲使用d/M/Y格式的碳的實例。但是它會在數據庫中保存爲mm-dd-yyyy。最後,我不在乎它是如何保存到數據庫的,所以這就是爲什麼我想創建getPublishedAtAttribute並以我想要的格式檢索它的原因。那也行不通。

所有我想要的是Laravel格式化d/m/Y。每當我展示它時,無需像{{ $addon->published_at->format('d/m/Y') }}那樣做。

順便說一句:我想同樣的事情created_atupdated_at。任何想法我做錯了什麼?

Laravel版本:31年3月5日

+0

MySQL以'YYYY-MM-DD'格式檢索並顯示DATE值。 您可以在模型中創建一個獲取器,該模型返回格式化的值,您希望它在視圖中顯示。 – trommelaap

回答

3

我建議你不要浪費時間與日期格式類似,而不是像這樣創建一個訪問..

public function getFormattedPublishedAtAttribute() { 
    return $this->published_at->format('d/m/Y'); 
} 

這樣,您就可以使用默認的日期,也分別得到了格式化的日期使用..

$model->formattedPublishedAt; 
+0

應該這樣工作嗎? public function getPublishedAtAttribute($ date) { return $ date-> format('d/m/Y'); } 因爲對我來說,我得到'調用成員函數格式()字符串' –

+0

當你做'$ model-> published_at'時,Laravel會檢查是否有'getPublishedAtAttribute()'方法,如果是,通過它的價值。但是由於我們使用了不同的名稱,Laravel不會知道我們想要的屬性,所以我們必須使用'return $ this-> published_at-> format()' –

0

必須設置在碳指令的格式日期:

$this->attributes['published_at'] = Carbon::createFromFormat('d/m/Y', $date)->format('Y-m-d'); 
0

好吧,所以經過一些進一步深挖,我這樣做:

public function getPublishedAtAttribute($date) 
{ 
    $date = new Carbon($date); 
    return $date->format('d/m/Y'); 
} 

,這是工作。但我不明白爲什麼我必須做$date = new Carbon($date);才能正常工作。如果我離開它,我得到Call to a member function format() on string。 (試用published_at,created_atupdated_at,都一樣)。

但由於published_at是在我的$dates = [];數組中,不應該像自動處理碳實例嗎? created_atupdated_at更是如此?

但據我所知,事實並非如此。如果我dd($addon->created_at);它只是一個字符串,而不是碳實例(如果我忽略了$date = new Carbon($date);)。

+0

來指定它。對不起,我錯了。這是一個碳實例。儘管如此,爲什麼我不得不在存取器中添加一個碳實例。 –

+0

您不需要創建Carbon實例。默認情況下,Laravel中'created_at'和'updated_at'的日期都是Carbon實例。如果你正在使用軟刪除,你意識到你將需要創建'protected $ dates = ['deleted_at'];'這是爲'deleted_at'創建一個Carbon實例。 –