web-dev-qa-db-fra.com

Laravel Erreur "Données inattendues trouvées" lors de la tentative de modification du format de Carbon created_at date

Lorsque j'essaie de modifier le format du champ created_at par défaut de mon modèle de ressource, j'obtiens l'erreur suivante:

{  
   "error":{  
      "type":"InvalidArgumentException",
      "message":"Unexpected data found.
                 Unexpected data found.
                 The separation symbol could not be found
                 Unexpected data found.
                 A two digit second could not be found",
      "file":"\/var\/www\/html\...vendor\/nesbot\/carbon\/src\/Carbon\/Carbon.php",
      "line":359
   }
}

Voici le code qui a produit l'erreur ci-dessus:

$tile = Resource::with('comments, ratings')->where('resources.id', '=', 1)->first();
$created_at = $tile->created_at;
$tile->created_at = $created_at->copy()->tz(Auth::user()->timezone)->format('F j, Y @ g:i A');

Si je supprime ->format('F j, Y @ g:i A') du code ci-dessus, cela fonctionne bien, mais ce n'est pas dans le format que je veux. Quel pourrait être le problème? J'ai du code presque identique ailleurs dans mon application et cela fonctionne sans erreur.

PDATE: L'utilisation de setToStringFormat('F j, Y @ g:i A') ne provoque pas d'erreur, mais renvoie null.

11
chipit24

L'ajout du code suivant à mon modèle a fonctionné pour moi:

public function getCreatedAtAttribute($date)
{
    if(Auth::check())
        return Carbon\Carbon::createFromFormat('Y-m-d H:i:s', $date)->copy()->tz(Auth::user()->timezone)->format('F j, Y @ g:i A');
    else
        return Carbon\Carbon::createFromFormat('Y-m-d H:i:s', $date)->copy()->tz('America/Toronto')->format('F j, Y @ g:i A');
}

public function getUpdatedAtAttribute($date)
{
    return Carbon\Carbon::createFromFormat('Y-m-d H:i:s', $date)->format('F j, Y @ g:i A');
}

Cela me permet d'utiliser created_at et updated_at dans le format que je veux.

13
chipit24

J'ai rencontré le même problème, et dans ma recherche d'une réponse, je suis tombé sur Comment expliquez-vous le résultat d'un nouveau\DateTime ('0000-00-00 00:00:00')? .

J'ai décidé de changer les colonnes datetime dans la base de données en nullable avec la valeur par défaut = NULL, pour empêcher les champs d'avoir la valeur '0000-00-00 00:00:00'.

Ma migration dans laravel 5 ressemble à ceci:

Schema::table('table', function($table)
{
    $table->dateTime('created_at')->nullable()->default(null)->change();
    $table->dateTime('updated_at')->nullable()->default(null)->change();
});
6
thephper

Ce n'est pas un problème de carbone, c'est un conflit entre un setAttribute ou getAttribute dans votre modèle.

5
alan

Vous ne devriez pas essayer de changer le format de created_at. Ce doit être un objet en carbone. Si vous souhaitez afficher la date created_at Dans un format différent, formatez-la simplement au moment de la sortie. Ou vous pouvez créer une méthode qui modifie le format afin que vous puissiez l'appeler quand vous le souhaitez dans un format différent. Par exemple, ajoutez une méthode comme celle-ci à votre classe de ressources:

public function createdAtInMyFormat()
{
   return $this->created_at->format('F j, Y @ g:i A');
}

Vous pouvez également demander à cette fonction d'ajuster le fuseau horaire, etc. Vous pouvez ensuite utiliser $tile->createdAtInMyFormat() par exemple pour obtenir votre format spécial created_at À partir de votre objet $tile.

2
orrd

Vous devez analyser la date donnée avant d'enregistrer ce code utilisateur

Carbon::parse($request->input('some_date'));
0
saeed karimi

J'ai rencontré ce problème, et c'était simplement une question d'utilisation des tirets au lieu des barres obliques.

$model->update(['some_date' => '2020/1/1']); // bad
$model->update(['some_date' => '2020-1-1']); // good

Rappel: Si vous spécifiez vos dates sur votre modèle, Eloquent est assez intelligent pour le convertir pour vous.

protected $dates = [ 'some_date' ];
0
Matt