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

@MehdiMaghrooni我没有。
Loko

这就是问题所在,您想访问甚至不存在的列。您要么更改表以添加该表,要么简单地删除该表。

@bad_boy我什至没有在我的代码中的任何地方使用updated_at。
Loko

@bad_boy我只需要在模型中将时间戳记设置为假即可
Loko

Answers:


426

在模型中,编写以下代码;

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_atupdated_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
这应该是正确的答案。设置时间戳会删除这两个字段。谢谢!!!
Sameera K

3
由于问题中显示的错误中的updated_at字段刚刚出现,因此这是正确的答案。
安德烈斯·菲利普

1
这个答案是最好的答案
-Mojtaba,

15

亚历克斯(Alex)和萨默(Sameer)给出了不错的答案,但也许只是有关为什么需要添加的其他信息

public $timestamps = false;

Laravel官方页面上很好地解释了时间戳:

默认情况下,Eloquent期望> table上存在created_at和Updated_at列。如果您不希望这些列由> Eloquent自动管理,请将模型上的$ timestamps属性设置为false。


14

对于使用laravel 5或更高版本的用户,必须使用public修饰符,否则将引发异常

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

public $timestamps = false;
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.