Laravel Columna desconocida 'updated_at'


160

Acabo de comenzar con Laravel y aparece el siguiente error:

La columna desconocida 'updated_at' se inserta en gebruikers (naam, wachtwoord, updated_at, created_at)

Sé que el error es de la columna de marca de tiempo cuando migras una tabla pero no estoy usando el updated_atcampo. Solía ​​usarlo cuando seguía el tutorial de Laravel, pero ahora que estoy haciendo (o intento hacer) mis propias cosas. Recibo este error aunque no uso marcas de tiempo. Parece que no puedo encontrar el lugar donde se está utilizando. Este es el código:

Controlador

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

Ruta

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

Modelo

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

Debo estar olvidando algo ... ¿Qué estoy haciendo mal aquí?


revise su tabla si tiene una columna updated_at !
Mehdi Maghrouni

@MehdiMaghrooni, no.
Loko

Y ese es el problema, desea acceder a la columna que ni siquiera existe. Debes alterar tu tabla para agregar la tabla o simplemente eliminarla.
Yang

@bad_boy Ni siquiera estoy usando updated_at en ninguna parte de mi código.
Loko

@bad_boy Solo tenía que poner las marcas de tiempo en falso en el modelo ...
Loko

Respuestas:


427

En el modelo, escriba el siguiente código;

public $timestamps = false;

Esto funcionaria.

Explicación: Por defecto, laravel esperará la columna created_at & updated_at en su tabla. Al hacerlo en falso, anulará la configuración predeterminada.


77
@RameshPareek Se afirma en los documentos :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 menos que esto sea para fines de auditoría, no veo por qué esto es necesario para empezar, probablemente deba desactivarse de manera predeterminada y habilitarse como una opción.
OzzyTheGiant

24

Establecer marcas de tiempo en falso significa que va a perder tanto created_at como updated_at, mientras que puede configurar ambas claves en su modelo.

Caso 1:

Tiene una created_atcolumna pero no update_at que simplemente podría establecer updated_aten falso en su modelo

class ABC extends Model {

const UPDATED_AT = null;

Caso 2:

Tienes ambas created_aty updated_atcolumnas pero con diferentes nombres de columna

Simplemente podrías hacer:

class ABC extends Model {

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

Finalmente ignorando las marcas de tiempo por completo:

class ABC extends Model {

public $timestamps = false;

3
Esta debería ser la respuesta correcta. Establecer marcas de tiempo elimina ambos campos. ¡¡¡Gracias!!!
Sameera K

3
Esta es la respuesta correcta debido al campo recién actualizado en el error que se muestra en la pregunta.
Andres Felipe

1
Esta es la mejor respuesta
Mojtaba

15

Buena respuesta de Alex y Sameer, pero tal vez solo información adicional sobre por qué es necesario poner

public $timestamps = false;

Las marcas de tiempo se explican muy bien en la página oficial de Laravel :

De manera predeterminada, Eloquent espera que las columnas created_at y updated_at existan en sus> tablas. Si no desea que estas columnas sean administradas automáticamente por> Eloquent, establezca la propiedad $ timestamps en su modelo en falso.


14

Para aquellos que usan laravel 5 o superior, deben usar un modificador público; de lo contrario, arrojará una excepción

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

public $timestamps = false;
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.