我刚刚开始使用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;
}

我一定是忘记了什么……我哪里做错了?


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

public $timestamps = false;

这是可行的。

解释:默认情况下,laravel将在你的表中期望created_at和updated_at列。 通过将其设置为false,它将覆盖默认设置。


对于那些使用laravel 5或以上必须使用公共修饰符的人,否则将抛出异常

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

public $timestamps = false;

Alex和Sameer的回答很好,但也许只是关于为什么有必要放置的额外信息

public $timestamps = false;

时间戳在Laravel官方页面上有很好的解释:

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


将时间戳设置为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;
}

链接到laravel文档https://laravel.com/docs/9.x/eloquent#timestamps


如果你仍然需要时间戳,但只是忘记在迁移中添加它们,在迁移文件中添加以下内容也可以工作:

class AddUsersTable extends Migration
{
    public function up()
    {
        Schema::create('users', function (Blueprint $table) {
            $table->timestamps(); // <-- Add this to add created_at and updated_at
        });
    }
}

之后不要忘记重新运行迁移。

php artisan migrate:rollback
php artisan migrate

第一个解决方案

如果不需要created_at和updated_at,请在模型中写下面的代码。

public $timestamps = false;

第二个解决方案

如果将来需要使用created_at和updated_at,可以添加列。

创建迁移文件:

php artisan make:migration add_timestamps_fields_to_users_table

编辑迁移文件:

class AddTimestampsFieldsToUsersTable extends Migration
{
    public function up()
    {
        Schema::table('users', function (Blueprint $table) {
            $table->timestamps();
        });
    }
}

运行迁移:

php artisan migrate