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.
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')
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
.
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
.
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;
}