Unbekannte Laravel-Spalte 'update_at'

160

Ich habe gerade mit Laravel angefangen und erhalte die folgende Fehlermeldung:

Unbekannte Spalte 'updated_at' in gebruikers einfügen (naam, wachtwoord, updated_at, created_at)

Ich weiß, dass der Fehler aus der Zeitstempelspalte stammt, wenn Sie eine Tabelle migrieren, aber ich verwende die nicht updated_at Feld nicht. Ich habe es verwendet, als ich dem Laravel-Tutorial gefolgt bin, aber jetzt, wo ich meine eigenen Sachen mache (oder versuche, sie zu machen). Ich erhalte diesen Fehler, obwohl ich keine Zeitstempel verwende. Ich kann den Ort, an dem es benutzt wird, nicht finden. Dies ist der Code:

Regler

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

Modell

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

Ich muss etwas vergessen ... Was mache ich hier falsch?

Loko
quelle
Überprüfen Sie Ihre Tabelle, wenn Sie die Spalte update_at haben !
Mehdi Maghrouni
@ MehdiMaghrooni Ich nicht.
Loko
Und das ist das Problem, Sie möchten auf die Spalte zugreifen, die noch nicht einmal existiert. Sie müssen entweder Ihre Tabelle ändern, um die hinzuzufügen, oder diese einfach entfernen.
Yang
@bad_boy Ich benutze nicht einmal update_at irgendwo in meinem Code.
Loko
@bad_boy Ich musste nur die Zeitstempel auf falsch im Modell setzen ...
Loko

Antworten:

426

Schreiben Sie im Modell den folgenden Code.

public $timestamps = false;

Das würde funktionieren.

Erläuterung: Standardmäßig erwartet laravel in Ihrer Tabelle die Spalte created_at & updated_at. Wenn Sie den Wert auf "false" setzen, wird die Standardeinstellung überschrieben.

Sameer Shaikh
quelle
7
@RameshPareek Es ist in den Dokumenten angegeben :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
Sofern dies nicht zu Prüfungszwecken dient, verstehe ich nicht, warum dies zunächst erforderlich ist, wahrscheinlich standardmäßig deaktiviert und als Option aktiviert werden sollte.
OzzyTheGiant
24

Wenn Sie Zeitstempel auf false setzen, verlieren Sie sowohl created_at als auch update_at, während Sie beide Schlüssel in Ihrem Modell festlegen können.

Fall 1:

Sie haben eine created_atSpalte, aber kein update_at, das Sie updated_atin Ihrem Modell einfach auf false setzen können

class ABC extends Model {

const UPDATED_AT = null;

Fall 2:

Sie haben beide created_atund updated_atSpalten, aber mit unterschiedlichen Spaltennamen

Sie könnten einfach tun:

class ABC extends Model {

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

Endlich Zeitstempel komplett ignorieren:

class ABC extends Model {

public $timestamps = false;
usrNotFound
quelle
3
Dies sollte die richtige Antwort sein. Durch das Festlegen von Zeitstempeln werden beide Felder entfernt. Vielen Dank!!!
Sameera K
3
Dies ist die richtige Antwort aufgrund des gerade aktualisierten_at-Felds in dem in der Frage angezeigten Fehler.
Andres Felipe
1
Diese Antwort ist die beste
Mojtaba
15

Schöne Antwort von Alex und Sameer, aber vielleicht nur zusätzliche Informationen darüber, warum es notwendig ist, zu setzen

public $timestamps = false;

Zeitstempel werden auf der offiziellen Laravel-Seite ausführlich erklärt :

Standardmäßig erwartet Eloquent, dass die Spalten created_at und updated_at in Ihren> Tabellen vorhanden sind. Wenn Sie nicht möchten, dass diese Spalten automatisch von> Eloquent verwaltet werden, setzen Sie die Eigenschaft $ timestamps in Ihrem Modell auf false.


quelle
14

Für diejenigen, die Laravel 5 oder höher verwenden, muss ein öffentlicher Modifikator verwendet werden. Andernfalls wird eine Ausnahme ausgelöst

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

public $timestamps = false;
Basheer Kharoti
quelle