Laravel Kolom Tidak Dikenal 'updated_at'


160

Saya baru saja mulai dengan Laravel dan saya mendapatkan kesalahan berikut:

Kolom 'updated_at' tidak dikenal masukkan ke gebruikers (naam, wachtwoord, updated_at, Created_at)

Saya tahu kesalahan ini dari kolom cap waktu ketika Anda memigrasi tabel tapi saya tidak menggunakan updated_atbidang. Saya dulu menggunakannya ketika saya mengikuti tutorial Laravel tetapi sekarang saya membuat (atau mencoba membuat) barang-barang saya sendiri. Saya mendapatkan kesalahan ini meskipun saya tidak menggunakan cap waktu. Sepertinya saya tidak dapat menemukan tempat di mana itu digunakan. Ini kodenya:

Pengendali

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

Rute

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

Saya pasti lupa sesuatu ... Apa yang saya lakukan salah di sini?


periksa tabel Anda jika Anda memiliki kolom updated_at !
— Mehdi Maghrouni

@MehdiMaghrooni saya tidak.
— Loko

Dan itulah masalahnya, Anda ingin mengakses kolom yang bahkan tidak ada. Anda harus mengubah tabel Anda untuk menambahkan satu, atau hanya menghapus yang itu.
— Yang

@bad_boy Saya bahkan tidak menggunakan updated_at di mana pun dalam kode saya.
— Loko

@bad_boy Saya baru saja meletakkan cap waktu salah pada model ...
— Loko

Jawaban:


427

Dalam model, tulis kode di bawah ini;

public $timestamps = false;

Ini akan berhasil.

Penjelasan: Secara default laravel akan mengharapkan kolom Created_at & updated_at di tabel Anda. Dengan menjadikannya false, itu akan menimpa pengaturan default.


7
@RameshPareek Hal ini dinyatakan dalam dokumen :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

Kecuali jika ini untuk keperluan audit, saya tidak melihat mengapa ini perlu dimulai, mungkin harus dinonaktifkan secara default dan diaktifkan sebagai opsi.
— OzzyTheGiant

24

Mengatur cap waktu ke false berarti Anda akan kehilangan kedua Created_at dan updated_at sedangkan Anda dapat mengatur kedua kunci dalam model Anda.

Kasus 1:

Anda memiliki created_atkolom tetapi tidak memutakhirkan_at sehingga Anda dapat dengan mudah menetapkan updated_atfalse dalam model Anda

class ABC extends Model {

const UPDATED_AT = null;

Kasus 2:

Anda memiliki keduanya created_atdan updated_atkolom tetapi dengan nama kolom yang berbeda

Anda bisa melakukannya:

class ABC extends Model {

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

Akhirnya mengabaikan cap waktu sepenuhnya:

class ABC extends Model {

public $timestamps = false;

3
ini seharusnya jawaban yang benar. Mengatur stempel waktu menghapus kedua bidang. Terima kasih!!!
— Sameera K

3
Ini adalah jawaban yang benar karena bidang yang baru saja diperbarui pada kesalahan yang ditunjukkan dalam pertanyaan.
— Andres Felipe

1
Jawaban ini adalah yang terbaik
— Mojtaba

15

Jawaban yang bagus oleh Alex dan Sameer, tapi mungkin hanya info tambahan tentang mengapa perlu dimasukkan

public $timestamps = false;

Stempel waktu dijelaskan dengan baik di halaman resmi Laravel :

Secara default, Eloquent mengharapkan kolom Created_at dan updated_at ada di> tabel Anda. Jika Anda tidak ingin kolom ini dikelola secara otomatis oleh> Eloquent, setel properti $ timestamps pada model Anda ke false.


14

Bagi mereka yang menggunakan laravel 5 atau di atas harus menggunakan pengubah publik selain itu akan membuang pengecualian

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

public $timestamps = false;
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.