web-dev-qa-db-fra.com

Carbone dans Laravel 4 InvalidArgumentException - Données inattendues trouvées. Données de suivi

J'essaie d'obtenir un résultat de requête Eloquent pour DB::raw("DATE_FORMAT(created_at, '%m-%d-%Y %r') AS created_at") mais chaque fois que Carbon obtient cette exception:

InvalidArgumentException
Unexpected data found. Trailing data

Si je le change simplement en created_at au lieu d'utiliser la fonction DATE_FORMAT() de MySQL, les données sont alors obtenues sans problème.

Non seulement j'ai déjà fait ce genre de formatage de date sans problème, mais j'ai vérifié chaque champ de la table de la base de données (il n'y en a que 10 pour cette graine) et chacun est une date valide standard, alors je me demande pourquoi Carbon lance un ajustement.

Lancer ceci dans Laravel 4.1.

13
eComEvo

Dans un résultat de requête Eloquent (modèle), chaque champ date est un objet carbone , cela signifie que si vous interrogez un modèle contenant un champ timestamp comme created_at, updated_at (créé essentiellement à l'aide de timestamps() pendant la migration) et deleted_at, Laravel les dans un objet Carbon et vous pouvez utiliser n’importe quelle méthode publique de Carbon, par exemple:

$user = User::find(1);

// '2014-04-20 19:02:09' will become 'Apr 20, 2014'
$user->created_at->toFormattedDateString();

Vous pouvez donc directement utiliser n'importe quelle méthode publique de Carbon sur un champ timestamp disponible dans un modèle. Si vous essayez ceci:

dd($user->created_at);

Ensuite, le résultat sera:

object(Carbon\Carbon)[456]
  public 'date' => string '2014-04-20 19:02:09' (length=19)
  public 'timezone_type' => int 3
  public 'timezone' => string 'UTC' (length=3)

Donc, si vous voulez format une date, vous pouvez utiliser:

// outputs like: 'Sunday 20th of April 2014 07:02:09 PM'
$user->created_at->format('l jS \\of F Y h:i:s A')

Mettre à jour:

Si vous souhaitez modifier ce comportement, cela signifie que si vous souhaitez indiquer à Laravel that quels champs doivent être convertis automatiquement en objet Carbon, vous pouvez le remplacer en créant une méthode dans votre modèle, telle que:

public function getDates()
{
    // only this field will be converted to Carbon
    return array('updated_at');
}

Pour désactiver totalement les mutations de date, renvoyez simplement un tableau vide à partir de la méthode getDates. Pour plus de détails, consultez Date Mutators sur le site Web Laravel.

24
The Alpha

Je me rends compte que la question initiale fait référence à MySQL mais j'ai eu la même erreur avec MSSQL. Le problème s'est avéré que le type de colonne datetime de MSSQL a une précision de 0,001 seconde, mais je fixais le format de mon modèle sans précision:

protected function getDateFormat()
{
    return 'Y-m-d G:i:s';
}

En utilisant le type de colonne DateTime2 plus récent et en désactivant la précision, j'ai corrigé l'erreur. C'est à dire.

datetime2(0)

Vous pouvez bien sûr changer le format dans getDateFormat.

6
voidstate

Si cela peut aider quelqu'un d'autre, j'ai la même erreur en essayant de copier une date.

$user->last_login = Carbon::now();

if ($user->first_login < Carbon::createFromDate(2000, 1, 1)) {
    // This is the users first login
    $user->first_login = $user->last_login; // FAILS!
}

Il s'avère que Laravel convertit la valeur de $user->last_login en chaîne DateTime + Timezone. Ce n'est plus un objet Carbon.

Vous pouvez corriger l'erreur en utilisant des copies d'un seul objet Carbon (exemple ci-dessous) ou en configurant des mutateurs (paramètres) sur le modèle sous-jacent.

$now = Carbon::now();
$user->last_login = $now;

if ($user->first_login < Carbon::createFromDate(2000, 1, 1)) {
    // This is the users first login
    $user->first_login = $now;
}
0
Wireblue