web-dev-qa-db-fra.com

Insérer des données created_at avec Laravel

Je n'arrive pas à insérer created_at données dans la table de base de données avec Laravel. J'essaie d'obtenir ces données d'un POST), puis j'essaie de les sauvegarder dans la base de données.

Je suis en train de faire comme ça:

$create_dt = date("Y-m-d H:i:s A", strtotime($_POST['post_date']." ".$_POST['post_time']));
$name = $_POST['name'];

$post = new Post();
$post->name = $name;
...
$post->created_at = $create_dt;
$post->save();

Mais cela donne une erreur:

Uncaught exception 'InvalidArgumentException' with message in Carbon.php

et

Unexpected data found. Unexpected data found. Data missing in Carbon.php

Comment puis-je résoudre ça? Dois-je définir $timestamps dans mes modèles à faux? (Je ne veux vraiment pas faire ça parce que je comprends bien comment il insère automatiquement le updated_at)

27
maxxon15

Dans votre modèle User, ajoutez la ligne suivante dans la classe User:

public $timestamps = true;

Maintenant, chaque fois que vous enregistrez ou mettez à jour un utilisateur, Laravel mettra automatiquement à jour le created_at et updated_at des champs.


Mise à jour:
Si vous souhaitez définir manuellement la création de, vous devez utiliser le format de date Y-m-d H:i:s. Le problème est que le format que vous avez utilisé n’est pas le même que Laravel utilise pour le created_at champ.

Mise à jour: nov. 2018 Laravel 5.6"message": "Access level to App\\Note::$timestamps must be public", Assurez-vous également d'avoir le bon niveau d'accès. Laravel 5.6 est public.

38
Jerodev

Vous pouvez le définir manuellement à l'aide de Laravel. N'oubliez pas d'ajouter 'created_at' à votre tableau $ fillable:

protected $fillable = ['name', 'created_at']; 
19
Sabrina Leggett

Actuellement (Laravel 5.4), le moyen d'y parvenir est:

$model = new Model();
$model->created_at = Carbon::now();
$model->save(['timestamps' => false]);
8
eithed
$data = array();
$data['created_at'] =new \DateTime();
DB::table('practice')->insert($data);
8
socm_

Dans mon cas, je voulais test unitaire que les utilisateurs n'étaient pas en mesure de vérifier leurs adresses électroniques après une heure, je ne voulais donc donner aucune autre réponse, car ils le feraient également. persiste quand je ne fais pas de tests unitaires, alors j'ai fini par mettre à jour manuellement la ligne après l'insertion:

// Create new user
$user = factory(User::class)->create();

// Add an email verification token to the 
// email_verification_tokens table
$token = $user->generateNewEmailVerificationToken();

// Get the time 61 minutes ago
$created_at = (new Carbon())->subMinutes(61);

// Do the update
\DB::update(
    'UPDATE email_verification_tokens SET created_at = ?',
    [$created_at]
);

Remarque: Pour toute autre chose que les tests unitaires, je regarderais les autres réponses ici.

1
Mike