0

というフィールドがactivated_atあり、Laravel の他のすべての日付と同じように扱いたいと考えています。データベースではタイムスタンプであり、 、 、など$datesの一般的な日付とともに配列内に挿入しました。updated_atcreated_atdeleted_at

これは、フォームや Web にまったく依存しない API システムの一部であるため、ビューから直接データを変換することはできません。

問題は、適切に設定して取得するために、2 つのミューテーター (ゲッターとセッター) をセットアップしたことです。

現在のセッター、それは最善の解決策ではありませんが、渡されたすべてのデータをデータベースに適したものに変換するセッターを作成する方法が正直にわかりません。私はMariaDBを使用しています

* Automatically parse the date from metric system to
 * Imperial system because American DATABASES
 *
 * @param string $value
 */
public function setActivatedAtAttribute($value)
{
    if(!$value instanceof \DateTime)
    {
        $value = Carbon::createFromFormat('d/m/Y H:i:s', $value)->toDateTimeString();
    }
    $this->attributes['activated_at'] = $value;
}

とにかく、このセッターは非常にうまく機能しています。私はたくさんの単体テストを書きましたが、それらは緑色です。

本当の問題はゲッターです。ゲッターは日付の Carbon インスタンスを返しますが、代わりに単に文字列を返します

/**
 * Return the correct metric format of the date
 *
 * @param string $value
 * @return string
 */
public function getActivatedAtAttribute($value)
{
    // Because it's a string we cannot use Carbon methods
    // Unless we instantiate a new Carbon object which it stupid
    // Since the activated_at field is inside the $dates array
    // Shouldn't we get the carbon object automatically?
    return $value;
}

私の懸念は、getter メソッド内のコメント ブロックにあります。

そうは言っても、Laravel 5.1.xでミューテーターを使用してDateTimeを処理するためのより良い方法はありますか? 以来、すべての日付時刻を処理することを気にしません。すでにカーテンの後ろで処理されていますcreated_atupdated_atdeleted_at

TL;DR

Laravel 5.1.xでミューテーターを使用してDateTimeを処理するためのより良い方法はありますか? 以来、すべての日付時刻を処理することを気にしません。すでにカーテンの後ろで処理されていますcreated_atupdated_atdeleted_at

4

2 に答える 2

0

私の知る限り、Laravel 5.1 では、「activated_at」フィールドを含む次のコードをモデルに追加する必要があります。

protected $dates=['activated_at'];

また、カーボンオブジェクトを取得するためにゲッターメソッドは必要ありません。コントローラーで直接その機能を呼び出すことができます。たとえば、ユーザーモデルを使用します。

User::findOrFail(1)->activated_at->diffForHumans();
于 2016-11-27T08:21:15.313 に答える