Question Horavel timestamps () ne crée pas CURRENT_TIMESTAMP


J'ai une migration qui a le timestamps() méthode, et puis j'ai une graine pour semer cette table.

Schema::create('mytable', function (Blueprint $table) {
    $table->increments('id');
    $table->string('title');
    $table->timestamps();
});

La graine ressemble à ceci:

DB::table('mytable')->insert([
    [
        'title' => 'My Awesome Title'
    ]
]);

Quand tout est exécuté, utilisez:

php artisan migrate:refresh --seed

L'élément est inséré, mais les valeurs de created_at et updated_at sont les deux 0000-00-00 00:00:00 pourquoi ne sont-ils pas correctement définis?

Voici les schémas de colonnes qu'il crée:

`created_at` TIMESTAMP NOT NULL DEFAULT '0000-00-00 00:00:00',
`updated_at` TIMESTAMP NOT NULL DEFAULT '0000-00-00 00:00:00',

Je voudrais ces programmes:

`created_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
`updated_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,

10
2017-12-29 17:28


origine


Réponses:


Lorsque vous insérez des données sans utiliser Eloquent, vous devez insérer vos propres horodatages.

Si tu utilises:

$x = new MyTable();
$x->title = 'My Awesome Title';
$x->save();

vous aurez l'horodatage rempli correctement (bien sûr vous devez créer MyTable modèle d'abord)

MODIFIER

Si vous le voulez vraiment, vous pouvez changer:

$table->timestamps();

dans:

$table->timestamp('created_at')->default(\DB::raw('CURRENT_TIMESTAMP'));
$table->timestamp('updated_at')->default(\DB::raw('CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP'));

Et si vous créez un modèle pour cette table, vous devez définir

$timestamps = false;

pour que Eloquent n'essaie pas de les mettre en route.

EDIT2

Il y a aussi un autre problème important. Si vous mélangez des dates de réglage dans des tables de PHP et d'autres en MySQL, vous devez vous assurer que PHP et MySQL ont exactement le même datetime (et le même fuseau horaire) ou utiliser la même comparaison de date que MySQL ou PHP). Sinon, lors de l'exécution de requêtes, vous risquez d'obtenir des résultats inattendus, par exemple

SELECT * FROM mytable WHERE DATE(created_at) = CURDATE()

peut être différent que d'exécuter une requête en dépassant la date de PHP

"SELECT * FROM mytable WHERE DATE(created_at) = '".date('Y-m-d")."'"

parce que sur le serveur PHP il pourrait être par exemple 2015-12-29 mais sur le serveur MySQL 2015-12-30


24
2017-12-29 17:31



Pour les versions ultérieures, vous pouvez simplement utiliser. (la source)

$table->timestamp('created_at')->useCurrent();
$table->timestamp('updated_at')->useCurrent();

2
2017-10-24 20:16



Je voudrais utiliser la bibliothèque de carbone si je sème dans les horodatages et mettre en place dans l'usine. sinon vous pourriez faire quelque chose comme ceci:

$timestamps = false;

et je retirerais le le $table->timestamps();  de la migration si je ne vais pas l'utiliser.


0
2017-12-29 19:32