Laravel未知专栏'updated_at'

Lok*_*oko 137 php mysql laravel laravel-migrations

我刚刚开始使用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');
}
Run Code Online (Sandbox Code Playgroud)

路线

Route::get('created', 'UserController@created');
Run Code Online (Sandbox Code Playgroud)

模型

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;
}
Run Code Online (Sandbox Code Playgroud)

我一定是忘记了什么......我在这里做错了什么?

Sam*_*ikh 368

在模型中,写下面的代码;

public $timestamps = false;
Run Code Online (Sandbox Code Playgroud)

这会奏效.

  • 你能描述一下为什么它有效吗? (8认同)
  • @RameshPareek在[docs](https://laravel.com/docs/5.6/eloquent#defining-models)中说明:`默认情况下,Eloquent希望您的表上存在created_at和updated_at列.如果您不希望Eloquent自动管理这些列,请将模型上的$ timestamps属性设置为false. (7认同)
  • 有趣的是,在迁移中,您必须指定创建时间戳,如下所示:`$table->timestamps();` 因此,在迁移中时间戳默认关闭,但在模型中默认打开。 (5认同)

Cle*_*ode 12

对于那些使用laravel 5或更高版本的人来说,必须使用public修饰符,否则会抛出异常

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

public $timestamps = false;
Run Code Online (Sandbox Code Playgroud)


小智 12

亚历克斯和萨梅尔的答案很好,但也许只是为什么有必要提供额外的信息

public $timestamps = false;
Run Code Online (Sandbox Code Playgroud)

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

默认情况下,Eloquent希望您的>表中存在created_at和updated_at列.如果您不希望通过> Eloquent自动管理这些列,请将模型上的$ timestamps属性设置为false.


usr*_*und 11

将时间戳记设置为false意味着您将同时丢失created_at和Updated_at,而您可以在模型中同时设置两个键。

情况1:

您有created_at列,但没有update_at,只需updated_at在模型中将其设置为false

class ABC extends Model {

const UPDATED_AT = null;
Run Code Online (Sandbox Code Playgroud)

情况2:

您同时拥有created_atupdated_at列,但具有不同的列名

您可以简单地执行以下操作:

class ABC extends Model {

const CREATED_AT = 'name_of_created_at_column';
const UPDATED_AT = 'name_of_updated_at_column';
Run Code Online (Sandbox Code Playgroud)

最后完全忽略时间戳:

class ABC extends Model {

public $timestamps = false;
Run Code Online (Sandbox Code Playgroud)

  • 这应该是正确答案。设置时间戳会删除这两个字段。谢谢!!! (3认同)
  • 由于问题中显示的错误中的只是 updated_at 字段,这是正确的答案。 (3认同)