私のモデルには次のものがあります:
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
秒を含めると機能します。秒は私にとって重要ではなく、日時ピッカーフィールドに秒を含めたくありません。これを回避する方法はありますか?それらのフィールドをまだ日付フィールドとして使用できますか?
日付文字列と日付形式が異なるため、形式文字列を変更するか、日付文字列を変更して一致させる必要があります。
このエラーは、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',
];
}
Christianが言うように、モデルに$ dateFormatを設定できますが、update_atフィールドとcreated_atフィールドを操作に含めることを望まない場合は、イベントを使用してデータベースに保存する前にdatetimeオブジェクトを「修正」できます。
これに関する公式ドキュメントがあります。 https://laravel.com/docs/5.2/eloquent#events
この機能は無効で、Datetimesのカーボンのエミュレーション https://laravel.com/docs/5.0/eloquent#date-mutators
public function getDates()
{
return [];
}
モデルでprotected $dateFormat
を'Y-m-d H:i
'に設定する必要があります。 https://laravel.com/docs/5.2/eloquent-mutators#date-mutators を参照してください
データベースの一部の行で必要な「created_at」または「updated_at」フィールドを省略していないことを確認してください。その場合、空のフィールドがあるレコードを削除するか、有効なタイムスタンプ形式で値を入力します(例: '2018-09-01 15:18:53')。
これは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();
それがすべてです、私はそれがうまくいくことを願っています
ハッピーコーディング...