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?

Loko
sumber
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.

Sameer Shaikh
sumber
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;
usrNotFound
sumber
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.


sumber
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;
Basheer Kharoti
sumber