Laravel不明な列 'updated_at'


160

Laravelを使い始めたばかりで、次のエラーが表示されます。

不明な列 'updated_at'がGebruikersに挿入されています(naam、wachtwoord、updated_at、created_at)

テーブルの移行時のタイムスタンプ列からのエラーであることはわかっていますが、updated_atフィールドを使用していません。Laravelチュートリアルを実行するときに使用していましたが、今は自分で作成(または作成しようとしている)しています。タイムスタンプを使用していないにもかかわらず、このエラーが発生します。使用されている場所が見つからないようです。これはコードです:

コントローラ

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::get('created', 'UserController@created');

型番

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

私は何かを忘れているに違いありません...ここで何が悪いのですか?


update_atがあるかどうかテーブルを確認してください!
Mehdi Maghrouni、2015

@MehdiMaghrooni私はしません。
Loko

そしてそれが問題です。存在しない列にもアクセスしたいのです。テーブルを変更してテーブルを追加するか、単にテーブルを削除する必要があります。
ヤン

@bad_boy私はコードのどこにもupdated_atを使用していません。
Loko

@bad_boyモデルでタイムスタンプをfalseに設定する必要がありました...
Loko

回答:


427

モデルで、以下のコードを記述します。

public $timestamps = false;

これはうまくいくでしょう。

説明:デフォルトでは、laravelはテーブルのcreated_atおよびupdated_at列を予期します。falseにすると、デフォルト設定が上書きされます。


7
@RameshPareekそれはドキュメントに記載されています: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

これが監査目的でない限り、これが最初に必要な理由はわかりません。おそらくデフォルトでオフにして、オプションとして有効にする必要があります。
OzzyTheGiant

24

タイムスタンプをfalseに設定すると、モデルに両方のキーを設定できるのに対して、created_atとupdated_atの両方が失われます。

ケース1:

created_at列がありますがupdate_atはありませんupdated_at。モデルで単にfalseに設定できます。

class ABC extends Model {

const UPDATED_AT = null;

ケース2:

と列の両方がcreated_atありupdated_atますが、列名が異なります

あなたは単に行うことができます:

class ABC extends Model {

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

最後に、タイムスタンプを完全に無視します。

class ABC extends Model {

public $timestamps = false;

3
これが正解です。タイムスタンプを設定すると、両方のフィールドが削除されます。ありがとう!!!
サメーラK

3
これは、質問に示されたエラーのJust_Updated_atフィールドによる正しい答えです。
Andres Felipe

1
この答えは最高の一つです
Mojtaba

15

AlexとSameerによる良い答えですが、多分、

public $timestamps = false;

タイムスタンプはLaravelの公式ページでうまく説明されています

デフォルトでは、Eloquentはテーブルにcreated_at列とupdated_at列が存在することを期待しています。これらの列をEloquentで自動的に管理したくない場合は、モデルの$ timestampsプロパティをfalseに設定します。


14

laravel 5以上を使用している人は、それ以外の場合はパブリック修飾子を使用する必要があり、例外がスローされます

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

public $timestamps = false;
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.