web-dev-qa-db-fra.com

Changer le nom de created_at et updated_at de Laravel

Puis-je cartographier les horodatages de Laravel à partir de:

created_at à post_date et post_date_gmt?

updated_at à post_modified et post_modified_gmt?


Je migre une application Wordpress vers Laravel.

J'accède à une copie de la base de données Wordpress en utilisant Laravel. La version en direct de la base de données est toujours en cours d'utilisation, je ne souhaite donc pas modifier le schéma.

La table Posts a post_date, post_date_gmt, post_modified et post_modified_gmt, mais Laravel attend created_at et updated_at.

Est-il possible de changer les noms de colonne que Laravel recherche?

J'aimerais que Laravel mette à jour les horodatages de toutes les colonnes déjà présentes.

30
user1894292

La réponse acceptée peut entraîner des problèmes de mise à jour des horodatages, malheureusement.

Vous feriez mieux de remplacer les consts sur votre modèle:

const CREATED_AT = 'post_date';
const UPDATED_AT = 'post_modified';

alors les méthodes getCreatedAtColumn et getUpdatedAtColumn renverront post_date et post_modified respectivement, mais ne feront aucun mal.

Pour les autres colonnes, vous devez utiliser des événements tels que ceux suggérés par @Oni.

59
Jarek Tkaczyk

Si vous examinez la source de la classe Eloquent

https://github.com/illuminate/database/blob/4.2/Eloquent/Model.php#L223-L235

Vous devriez pouvoir changer ces noms de colonne assez facilement en remplaçant ces constantes.

<?php

class YourModel extends Eloquent {

    /**
     * The name of the "created at" column.
     *
     * @var string
     */
    const CREATED_AT = 'post_date';

    /**
     * The name of the "updated at" column.
     *
     * @var string
     */
    const UPDATED_AT = 'post_modified';

}

En ce qui concerne la version _gmt de ces horodatages, vous voudrez peut-être examiner events. Voici un bon début

http://driesvints.com/blog/using-laravel-4-model-events

19
Oni

Vous pouvez essayer d'utiliser les attributs Getters et Getters:

class Post extends Eloquent
{
    public function getCreatedAtAttribute()
    {
        return $this->attributes['post_date'];
    }

    public function setCreatedAtAttribute($value)
    {
        $this->attributes['post_date'] = $value;

        // this may not work, depends if it's a Carbon instance, and may also break the above - you may have to clone the instance
        $this->attributes['post_date_gmt'] = $value->setTimezone('UTC');
    }
}

Je ne sais pas si cela fonctionnera, mais vous pouvez essayer. Certainement une base pour continuer peut-être - vous devrez jouer avec cela.

0
alexrussell