Colonne inconnue de Laravel 'updated_at'


160

Je viens de commencer avec Laravel et j'obtiens l'erreur suivante:

Insertion de la colonne inconnue 'updated_at' dans gebruikers (naam, wachtwoord, updated_at, created_at)

Je sais que l'erreur provient de la colonne d'horodatage lorsque vous migrez une table mais je n'utilise pas le updated_atchamp. J'avais l'habitude de l'utiliser quand je suivais le tutoriel Laravel mais maintenant que je fais (ou tente de faire) mes propres trucs. J'obtiens cette erreur même si je n'utilise pas d'horodatage. Je n'arrive pas à trouver l'endroit où il est utilisé. Voici le code:

Manette

public function created()
{
    if (!User::isValidRegister(Input::all())) {
        return Redirect::back()->withInput()->withErrors(User::$errors);
    }

    // Register the new user or whatever.
    $user = new User;
    $user->naam = Input::get('naam');
    $user->wachtwoord = Hash::make(Input::get('password'));
    $user->save();

    return Redirect::to('/users');
}

Route

Route::get('created', 'UserController@created');

Modèle

public static $rules_register = [
    'naam' => 'unique:gebruikers,naam'
];

public static $errors;
protected $table = 'gebruikers';

public static function isValidRegister($data)
{
    $validation = Validator::make($data, static::$rules_register);

    if ($validation->passes()) {
        return true;
    }

    static::$errors = $validation->messages();

    return false;
}

Je dois oublier quelque chose ... Qu'est-ce que je fais de mal ici?


vérifiez votre table si vous avez la colonne updated_at !
Mehdi Maghrouni

@MehdiMaghrooni Je ne sais pas.
Loko

Et c'est ça le problème, vous voulez accéder à la colonne qui n'existe même pas. Vous devez soit modifier votre table pour ajouter celle-ci, soit simplement supprimer celle-ci.
Yang

@bad_boy Je n'utilise même pas updated_at n'importe où dans mon code.
Loko

@bad_boy Je devais juste mettre les horodatages sur false dans le modèle ...
Loko

Réponses:


427

Dans le modèle, écrivez le code ci-dessous;

public $timestamps = false;

Cela fonctionnerait.

Explication: Par défaut, laravel attendra la colonne created_at & updated_at dans votre table. En le définissant sur false, il remplacera le paramètre par défaut.


7
@RameshPareek Il est indiqué dans la documentation :By default, Eloquent expects created_at and updated_at columns to exist on your tables. If you do not wish to have these columns automatically managed by Eloquent, set the $timestamps property on your model to false
Adam

À moins que ce ne soit à des fins d'audit, je ne vois pas pourquoi cela est nécessaire pour commencer, devrait probablement être désactivé par défaut et activé en option.
OzzyTheGiant

24

Définir les horodatages sur false signifie que vous allez perdre à la fois created_at et updated_at alors que vous pouvez définir les deux clés dans votre modèle.

Cas 1:

Vous avez une created_atcolonne mais pas update_at, vous pouvez simplement définir updated_atsur false dans votre modèle

class ABC extends Model {

const UPDATED_AT = null;

Cas 2:

Vous avez à la fois created_atetupdated_at colonnes mais avec des noms de colonnes différents

Vous pouvez simplement faire:

class ABC extends Model {

const CREATED_AT = 'name_of_created_at_column';
const UPDATED_AT = 'name_of_updated_at_column';

Enfin en ignorant complètement les horodatages:

class ABC extends Model {

public $timestamps = false;

3
cela devrait être la bonne réponse. La définition d'horodatages supprime les deux champs. Merci!!!
Sameera K

3
C'est la bonne réponse en raison du champ juste mis à jour_at dans l'erreur affichée dans la question.
Andres Felipe

1
Cette réponse est la meilleure
Mojtaba

15

Belle réponse d'Alex et Sameer, mais peut-être juste des informations supplémentaires sur pourquoi il est nécessaire de mettre

public $timestamps = false;

Les horodatages sont bien expliqués sur la page officielle de Laravel :

Par défaut, Eloquent s'attend à ce que les colonnes created_at et updated_at existent sur vos> tables. Si vous ne souhaitez pas que ces colonnes soient gérées automatiquement par> Eloquent, définissez la propriété $ timestamps de votre modèle sur false.


14

Pour ceux qui utilisent laravel 5 ou plus, ils doivent utiliser le modificateur public sinon cela lèvera une exception

Access level to App\yourModelName::$timestamps must be
public (as in class Illuminate\Database\Eloquent\Model)

public $timestamps = false;
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.