web-dev-qa-db-ja.com

Laravel Carbon Data Missing

私のモデルには次のものがあります:

protected $dates = [
    'start',
    'end',
    'created_at',
    'updated_at'
];

日時ピッカーを使用して、開始日と終了日を次の形式で挿入しています。

2016-01-23 22:00

秒なし。このようにすると、次のエラーが表示されます。

InvalidArgumentException in Carbon.php line 425:
Data missing
at Carbon::createFromFormat('Y-m-d H:i:s', '2016-01-23 22:00') in Model.php line 3015

秒を含めると機能します。秒は私にとって重要ではなく、日時ピッカーフィールドに秒を含めたくありません。これを回避する方法はありますか?それらのフィールドをまだ日付フィールドとして使用できますか?

23
Hardist

tl; dr

日付文字列と日付形式が異なるため、形式文字列を変更するか、日付文字列を変更して一致させる必要があります。

説明

問題

このエラーは、CarbonのcreateFromFormat関数が、渡されたフォーマット文字列と一致しない日付文字列を受信したときに発生します。より正確には、これは DateTime::createFromFormat 関数に由来します。Carbonはそれを単に呼び出すからです:

public static function createFromFormat($format, $time, $tz = null)
{
    if ($tz !== null) {
        $dt = parent::createFromFormat($format, $time, static::safeCreateDateTimeZone($tz));
    } else {
        $dt = parent::createFromFormat($format, $time); // Where the error happens.
    }

    if ($dt instanceof DateTime) {
        return static::instance($dt);
    }

    $errors = static::getLastErrors();
    throw new InvalidArgumentException(implode(PHP_EOL, $errors['errors'])); // Where the exception was thrown.
}

十分なデータがありません

この場合のように、日付文字列がフォーマット文字列よりも「短い」場合:

Carbon::createFromFormat('Y-m-d H:i:s', '2017-01-04 00:52');

カーボンは投げます:

Carbon.php行425のInvalidArgumentException:
データがありません

データが多すぎる

この場合のように、日付文字列がフォーマット文字列よりも「長い」場合:

 Carbon::createFromFormat('Y-m-d H:i', '2017-01-02 00:27:00');

カーボンは投げます:

Carbon.php行425のInvalidArgumentException:
追跡データ

フードの下

ミューテーターに関するドキュメント によると、デフォルトの日付形式は'Y-m-d H:i:s'です。日付処理は モデルのasDateTime関数 で行われます。最後の条件では、 getDateFormat function が呼び出されます。これは、カスタム形式の元です。デフォルトの形式は データベースのGrammarクラスで定義 です。

解決

日付文字列がフォーマット文字列と一致することを確認する必要があります。

フォーマット文字列を変更する

次のようにデフォルトのフォーマット文字列をオーバーライドできます。

class Event extends Model {
    protected $dateFormat = 'Y-m-d H:i';
}

このアプローチには2つの問題があります。

  • これは、モデルの$dates配列で定義されたすべてのフィールドに適用されます。
  • この形式のデータをデータベースに保存する必要があります。

日付文字列を編集およびフォーマットする

私の推奨する解決策は、日付形式をデフォルトの'Y-m-d H:i:s'のままにして、次のように日付の欠落部分を完了することです。

public function store(Request $request) {
    $requestData = $request->all();
    $requestData['start_time'] .= ':00';
    $requestData['end_time'] .= ':00';
    $event = new Event($requestData);
    $event->save();
}

日付を使用する場合は、フォーマットする必要があります。

public function show(Request request, $eventId) {
    $event = Event::findOrFail($eventId);
    $startTime = $event->start_time->format('Y-m-d H:i');
    $endTime = $event->end_time->format('Y-m-d H:i');
}

もちろん、フィールドは日付に変更する必要があります。

class Event extends Model {
    protected $dates = [
        'start_time',
        'end_time',
        'created_at',
        'updated_at',
        'deleted_at',
    ];
}
56
totymedli

Christianが言うように、モデルに$ dateFormatを設定できますが、update_atフィールドとcreated_atフィールドを操作に含めることを望まない場合は、イベントを使用してデータベースに保存する前にdatetimeオブジェクトを「修正」できます。

これに関する公式ドキュメントがあります。 https://laravel.com/docs/5.2/eloquent#events

4
subzeta

モデル

この機能は無効で、Datetimesのカーボンのエミュレーション https://laravel.com/docs/5.0/eloquent#date-mutators

public function getDates()
{
    return [];
}
4

モデルでprotected $dateFormat'Y-m-d H:i 'に設定する必要があります。 https://laravel.com/docs/5.2/eloquent-mutators#date-mutators を参照してください

3
mazedlx

データベースの一部の行で必要な「created_at」または「updated_at」フィールドを省略していないことを確認してください。その場合、空のフィールドがあるレコードを削除するか、有効なタイムスタンプ形式で値を入力します(例: '2018-09-01 15:18:53')。

0

これは1つの可能性です

結果データの列を確認する必要があります。列名「created_at」または「updated_at」がヌルの場合、このエラーが発生します。

解決方法?まず、Laravel carbon。を使用して、これらの2つの列にデータを保存する必要があります。

$user = new User();
$user->created_at = Carbon::now()->setTime(0,0)->format('Y-m-d H:i:s');
$user->updated_at = Carbon::now()->setTime(0,0)->format('Y-m-d H:i:s');
$user->save();

それがすべてです、私はそれがうまくいくことを願っています

ハッピーコーディング...

0
Inamur Rahman