Laravel Unknown Column 'updated_at'


160

Ho appena iniziato con Laravel e ottengo il seguente errore:

La colonna sconosciuta 'updated_at' si inserisce nei gebruikers (naam, wachtwoord, Updated_at, Created_at)

So che l'errore proviene dalla colonna timestamp quando esegui la migrazione di una tabella ma non sto usando il updated_atcampo. Lo usavo quando seguivo il tutorial di Laravel ma ora che sto realizzando (o tentando di creare) le mie cose. Ricevo questo errore anche se non utilizzo i timestamp. Non riesco a trovare il posto in cui viene utilizzato. Questo è il codice:

controllore

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');
}

Itinerario

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

Modello

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;
}

Devo dimenticare qualcosa ... Cosa sto facendo di sbagliato qui?


controlla la tua tabella se hai la colonna aggiornata_at !
Mehdi Maghrouni,

@MehdiMaghrooni Non lo so.
Loko,

E questo è il problema, vuoi accedere alla colonna che non esiste nemmeno. Devi modificare la tabella per aggiungere quella o semplicemente rimuoverla.
Yang,

@bad_boy Non sto nemmeno usando update_at da nessuna parte nel mio codice.
Loko,

@bad_boy Ho dovuto solo mettere i timestamp su false nel modello ...
Loko,

Risposte:


427

Nel modello, scrivi il codice seguente;

public $timestamps = false;

Questo funzionerebbe.

Spiegazione: Per impostazione predefinita, laravel prevede la colonna Created_at & Updated_at nella tabella. Rendendolo falso, sostituirà l'impostazione predefinita.


7
@RameshPareek È indicato nei documenti :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

A meno che questo non sia a scopo di controllo, non vedo perché questo sia necessario per cominciare, dovrebbe probabilmente essere disattivato per impostazione predefinita e abilitato come opzione.
OzzyTheGiant

24

Impostando i timestamp su false significa che stai per perdere sia Created_at che Updated_at mentre potresti impostare entrambe le chiavi nel tuo modello.

Caso 1:

Hai created_atcolonna ma non update_at puoi semplicemente impostare updated_atsu false nel tuo modello

class ABC extends Model {

const UPDATED_AT = null;

Caso 2:

Hai entrambe created_ate updated_atcolonne ma con nomi di colonna diversi

Potresti semplicemente fare:

class ABC extends Model {

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

Finalmente ignorando completamente i timestamp:

class ABC extends Model {

public $timestamps = false;

3
questa dovrebbe essere la risposta corretta. L'impostazione di timestamp rimuove entrambi i campi. Grazie!!!
Sameera K,

3
Questa è la risposta corretta a causa del campo appena aggiornato_at nell'errore mostrato nella domanda.
Andres Felipe,

1
Questa è la risposta migliore
Mojtaba,

15

Bella risposta di Alex e Sameer, ma forse solo informazioni aggiuntive sul perché è necessario mettere

public $timestamps = false;

I timestamp sono ben spiegati sulla pagina ufficiale di Laravel :

Per impostazione predefinita, Eloquent si aspetta che le colonne create_at e updated_at esistano nelle tue> tabelle. Se non si desidera che queste colonne vengano gestite automaticamente da> Eloquent, impostare la proprietà $ timestamps sul modello su false.


14

Per coloro che utilizzano laravel 5 o versioni successive devono utilizzare un modificatore pubblico, altrimenti verrà generata un'eccezione

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

public $timestamps = false;
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.