2
votes

Laravel - Comment convertir VARCHAR en TIMESTAMP ou DATETIME en utilisant RAW DB

J'utilise Laravel 5.8 pour exécuter une requête, à partir d'une table qui m'est donnée. J'ai observé que l'un des champs (created_at) est varchar au lieu de timestamp ou datetime. Notez que je ne peux pas modifier la table dans mon cas.

$winners = DB::table('winner')
    ->select('msisdn', 'created_at')               
    ->orderByRaw('created_at DESC')
    ->get(); 

J'utilise DB Raw.

À partir de ma requête, comment puis-je convertir, created_at (varchar) en horodatage ou date / heure.

Merci


3 commentaires

stackoverflow.com/questions/6238992/… < / a>


Double possible de Conversion de la chaîne en date et date / heure


Ce n'est pas un doublon, OP demande comment obtenir le champ de Db directement converti en horodatage, pas comment convertir une chaîne de date normale en PHP en horodatage, c'est différent


3 Réponses :


0
votes

Vous pouvez utiliser Carbon, qui est déjà inclus comme dépendance de Laravel: Documentation Carbon

$winners->map(static function($winner){
    $winner['created_at'] = \Carbon\Carbon::parse($winner['created_at']);

    return $winner;
});

Mais veuillez noter que Carbon :: parse () n'est peut-être pas la meilleure option ici, il est préférable de transmettre un format valide Carbon::createFromFormat(...).


0 commentaires

-1
votes

La meilleure façon de le faire est d'utiliser l'accesseur

Et dans votre modèle Winner , appliquez l'accesseur comme:

$winners = \App\Winner::select('msisdn', 'created_at')               
    ->orderByRaw('created_at DESC')
    ->get(); 

De cette façon, vous n'avez pas besoin de parcourir vos résultats après les avoir récupérés. De plus, vous récupérez peut-être les gagnants dans plusieurs contrôleurs, de cette façon, le created_at sera toujours un horodatage, vous n'avez donc pas besoin de vous en soucier et d'écrire du code à chaque fois après avoir récupéré les gagnants.

évident mais depuis que j'ai eu un vote négatif pour cela. Veuillez noter d'utiliser le modèle après avoir défini l'accesseur comme ceci:

public function getCreatedAtAttribute($date)
{
    return \Carbon\Carbon::parse($date);
}


2 commentaires

Il utilise DB Raw, ce qui signifie qu'il obtiendra une instance stdClass et non une instance de modèle Winner


@JoaquinMarcher, je pensais que c'était évident, je l'ai mentionné dans la réponse maintenant



2
votes

Utilisation de la fonction CAST de SQL comme ci-dessous

$winners = DB::table('winner')
    ->select( 'msisdn', DB::raw('CAST(created_at AS DATETIME)') )               
    ->orderByRaw('created_at DESC')
    ->get(); 


5 commentaires

Cela ne sera diffusé qu'à DATE et perdra la partie temporelle


N'a pas testé cela, mais cela retournera-t-il un PHP \ DateTime?


Oui. Ce sera. N'hésitez pas à l'essayer et faites-moi savoir si vous rencontrez des problèmes.


Je pense que DB :: raw ('DATETIME (created_at)') est également acceptable.


Question posée en utilisant raw DB .