Laravel Unknown Column „updated_at”

160

Właśnie zacząłem z Laravelem i otrzymuję następujący błąd:

Nieznana kolumna „updated_at” wstaw do gebruikers (naam, wachtwoord, updated_at, created_at)

Wiem, że błąd pochodzi z kolumny sygnatury czasowej podczas migracji tabeli, ale nie używam tego updated_atpola. Używałem go, gdy korzystałem z samouczka Laravel, ale teraz robię (lub próbuję tworzyć) własne rzeczy. Otrzymuję ten błąd, mimo że nie używam znaczników czasu. Nie mogę znaleźć miejsca, w którym jest używany. To jest kod:

Kontroler

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

Trasa

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

Model

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

Muszę o czymś zapomnieć ... Co ja tu robię źle?

Loko
źródło
sprawdź swoją tabelę, jeśli masz kolumnę updated_at !
Mehdi Maghrouni
@MehdiMaghrooni I dont.
Loko
I to jest problem, chcesz uzyskać dostęp do kolumny, która nawet nie istnieje. Musisz albo zmienić swój stół, aby dodać jeden, albo po prostu go usunąć.
Yang
@bad_boy Nie używam nawet updated_at nigdzie w moim kodzie.
Loko
@bad_boy Musiałem tylko ustawić znaczniki czasu na fałsz w modelu ...
Loko

Odpowiedzi:

426

W modelu napisz poniższy kod;

public $timestamps = false;

To by zadziałało.

Wyjaśnienie: Domyślnie laravel będzie oczekiwał w Twojej tabeli kolumn created_at i updated_at. Ustawienie wartości false spowoduje nadpisanie ustawienia domyślnego.

Sameer Shaikh
źródło
7
@RameshPareek Jest to powiedziane w dokumentach :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
O ile nie jest to dla celów audytu, nie rozumiem, dlaczego jest to konieczne na początku, prawdopodobnie powinno być domyślnie wyłączone i włączone jako opcja.
OzzyTheGiant
24

Ustawienie znaczników czasu na false oznacza, że ​​stracisz zarówno created_at, jak i updated_at, podczas gdy możesz ustawić oba klucze w swoim modelu.

Przypadek 1:

Masz created_atkolumnę, ale nie update_at, możesz po prostu ustawić updated_atw modelu wartość false

class ABC extends Model {

const UPDATED_AT = null;

Przypadek 2:

Masz zarówno kolumny, jak created_ati, updated_atale z różnymi nazwami kolumn

Możesz po prostu zrobić:

class ABC extends Model {

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

Wreszcie całkowite ignorowanie sygnatur czasowych:

class ABC extends Model {

public $timestamps = false;
usrNotFound
źródło
3
to powinna być prawidłowa odpowiedź. Ustawienie znaczników czasu powoduje usunięcie obu pól. Dzięki!!!
Sameera K
3
To jest poprawna odpowiedź ze względu na właśnie pole updated_at w błędzie pokazanym w pytaniu.
Andres Felipe
1
Ta odpowiedź jest najlepsza
Mojtaba
15

Dobra odpowiedź Alexa i Sameera, ale może tylko dodatkowe informacje o tym, dlaczego konieczne jest umieszczenie

public $timestamps = false;

Znaczniki czasu są ładnie wyjaśnione na oficjalnej stronie Laravel :

Domyślnie Eloquent oczekuje, że kolumny created_at i updated_at będą istnieć w tabelach>. Jeśli nie chcesz, aby te kolumny były automatycznie zarządzane przez> Eloquent, ustaw właściwość $ timestamps w swoim modelu na wartość false.


źródło
14

Dla tych, którzy używają laravel 5 lub nowszego, muszą użyć modyfikatora publicznego, w przeciwnym razie wyrzuci wyjątek

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

public $timestamps = false;
Basheer Kharoti
źródło