Coluna desconhecida do Laravel 'updated_at'

160

Acabei de começar com o Laravel e recebo o seguinte erro:

Coluna desconhecida 'updated_at' inserida nos gebruikers (naam, wachtwoord, updated_at, created_at)

Eu sei que o erro é da coluna de carimbo de data e hora quando você migra uma tabela, mas não estou usando o updated_atcampo. Eu costumava usá-lo quando seguia o tutorial do Laravel, mas agora estou criando (ou tentando fazer) minhas próprias coisas. Eu recebo esse erro mesmo que não use carimbos de data e hora. Não consigo encontrar o lugar onde está sendo usado. Este é o 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');
}

Rota

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

Devo estar esquecendo algo ... O que estou fazendo de errado aqui?

Loko
fonte
verifique sua tabela se você possui a coluna updated_at !
Mehdi Maghrouni
@MehdiMaghrooni I dont.
Loko
E esse é o problema, você deseja acessar a coluna que nem existe. Você precisa alterar sua tabela para adicionar uma ou simplesmente remover essa.
Yang
@bad_boy Eu nem estou usando updated_at em qualquer lugar do meu código.
Loko
@bad_boy eu só tive que colocar a data e hora em falso no modelo ...
Loko

Respostas:

427

No modelo, escreva o código abaixo;

public $timestamps = false;

Isso funcionaria.

Explicação: Por padrão, o laravel espera a coluna created_at & updated_at na sua tabela. Ao torná-lo falso, substituirá a configuração padrão.

Sameer Shaikh
fonte
7
@RameshPareek Afirma-se nos docs :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 isso seja para fins de auditoria, não estou vendo por que isso é necessário, provavelmente deve ser desativado por padrão e ativado como uma opção.
OzzyTheGiant
24

Definir timestamps como false significa que você perderá o created_at e updated_at enquanto você pode definir as duas chaves no seu modelo.

Caso 1:

Você tem created_atcoluna, mas não update_at, você pode simplesmente definir updated_atcomo false no seu modelo

class ABC extends Model {

const UPDATED_AT = null;

Caso 2:

Você tem colunas created_ate updated_atmas com nomes de colunas diferentes

Você poderia simplesmente fazer:

class ABC extends Model {

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

Por fim, ignorando completamente os registros de data e hora:

class ABC extends Model {

public $timestamps = false;
usrNotFound
fonte
3
essa deve ser a resposta correta. A configuração de carimbos de data e hora remove os dois campos. Obrigado!!!
Sameera K
3
Esta é a resposta correta devido ao campo just_ updated_at no erro mostrado na pergunta.
Andres Felipe
1
Esta resposta é o melhor
Mojtaba
15

Boa resposta de Alex e Sameer, mas talvez apenas informações adicionais sobre por que é necessário colocar

public $timestamps = false;

Os carimbos de data e hora são bem explicados na página oficial do Laravel :

Por padrão, o Eloquent espera que as colunas created_at e updated_at existam nas suas tabelas. Se você não deseja que essas colunas sejam gerenciadas automaticamente por> Eloquent, configure a propriedade $ timestamps no seu modelo como false.


fonte
14

Para aqueles que estão usando o laravel 5 ou superior, devem usar o modificador público de outra forma, lançará uma exceção

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

public $timestamps = false;
Basheer Kharoti
fonte