web-dev-qa-db-ja.com

Laravel:モデル属性のキャストで日付形式を設定する方法は?

私はモデルにあります:

protected $casts = [
    'date' => 'date',
];

laravelキャスト形式を設定する機能があります。

protected $casts = [
    'date' => 'date_format:d/m/yyyy',
];

編集済み

私はこれを試しました:

モデル内:

protected $dateFormat = 'm/d/Y';

protected $dates = ['driver_expiration', 'created_at', 'updated_at', 'deleted_at'];

protected $casts = [
    'driver_expiration'     => 'date',
];

日付(driver_expiration)を「01/012016」として保存しましたが、日付は0000-00-00に保存されます。

laravelのドキュメント: https://laravel.com/docs/5.1/eloquent-mutators $ dateFormatはタイムスタンプに対してのみ機能します( 'created_at'、 'updated_at'、 'deleted_at')

12
fico7489

日付形式をキャストする代わりに、ミューテーターを使用して好きな形式を設定できます。

たとえば、列の名前がdateである場合、次の関数をモデルに追加できます。

public function setDateAttribute( $value ) {
  $this->attributes['date'] = (new Carbon($value))->format('d/m/y');
}

setDateAttributeは、常にCamelCaseを使用したset[ColumnName]Attribute形式です。 $this->attributes['date']部分のdateも、テーブル内の実際の列名と一致する必要があります。

データベース内のレコードをcreateまたはupdateすると、上記の関数によってフォーマットが自動的に変更されます。

注:Carbonライブラリを使用するには、モデルの上部にuse Carbon\Carbonステートメントを追加する必要がある場合があります。

他の例をご覧ください


[〜#〜] update [〜#〜]

オプションで、次を使用してdate列の形式を定義できます。

protected $dateFormat = 'Y-m-d';
20
Niraj Shah

laravel 5.6の後、

Eloquentの日付と日時のキャストの形式を個別にカスタマイズできます。

protected $casts = [
    'birthday'  => 'date:Y-m-d',
    'joined_at' => 'datetime:Y-m-d H:00',
];

この形式は、モデルが配列またはJSONデータにシリアル化されるときに使用されます

26
Hemerson Varela

モデルに追加するだけです:

protected function asDateTime($value)
{
    return parent::asDateTime($value)->format('d/m/y');
}

このEloquentのメソッドは元々Carbonインスタンスを返すため、そのインスタンスを取得してformat()メソッドを呼び出すことができます。このソリューションをすべてのモデルに適用する場合、Eloquentから拡張された新しいクラスを作成し、このメソッドをそこに配置するだけで、この新しいクラスからモデルを拡張できます。

3
M Muller

キャストはCollectionオブジェクトの影響を受けません。 jsonおよび配列形式に使用されます。使用できる個々のキャストが必要な場合

 $user->date->format('m-d-Y');
1
Turan Zamanlı

新しいモデルプロパティを作成します。

protected $datesConvert = ['driver_expiration'];

そして、ベースモデルを次のように更新しました。

public function save(array $options = [])
{
    if(isset($this->datesConvert)){
        foreach($this->datesConvert as $date){
            $this->attributes[$date] = \Carbon\Carbon::createFromFormat('d/m/Y', $this->attributes[$date])->format('Y-m-d');
        }
    }

    parent::save($options);

}

public function getAttribute($key)
{
    $value = parent::getAttribute($key);

    if(isset($this->attributes[$key])){
        if(isset($this->datesConvert)  &&  in_array($key, $this->datesConvert)){
            $value = \Carbon\Carbon::createFromFormat('Y-m-d', $value)->format('d/m/Y');
        }

    }

    return $value;
}

そして、この解決策は私のために機能します。コードを特性に移動できます。フォーマットは$ datesConvert Format = 'd/m/Y'に入れることができます。

0
fico7489