Cột không xác định của Laravel 'update_at'


160

Tôi mới bắt đầu với Laravel và tôi gặp phải lỗi sau:

Cột không xác định 'update_at' chèn vào gebruikers (naam, wachtwoord, update_at, created_at)

Tôi biết lỗi là từ cột dấu thời gian khi bạn di chuyển bảng nhưng tôi không sử dụng updated_attrường. Tôi đã từng sử dụng nó khi tôi làm theo hướng dẫn của Laravel nhưng bây giờ tôi đang thực hiện (hoặc cố gắng thực hiện) công cụ của riêng mình. Tôi gặp lỗi này mặc dù tôi không sử dụng dấu thời gian. Tôi dường như không thể tìm thấy nơi nó đang được sử dụng. Đây là mã:

Bộ điều khiển

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

Tuyến đường

Route::get('created', 'UserController@created');

Mô hình

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

Tôi phải quên điều gì đó ... Tôi đang làm gì sai ở đây?


kiểm tra bảng của bạn nếu bạn có cột update_at !
Mehdi Maghrouni 2/2/2015

@MehdiMaghrooni Tôi không có.
Loko

Và đó là vấn đề, bạn muốn truy cập vào cột thậm chí không tồn tại. Bạn phải thay đổi bảng của mình để thêm bảng hoặc chỉ cần xóa bảng đó.
Dương

@bad_boy Tôi thậm chí không sử dụng update_at ở bất cứ đâu trong mã của tôi.
Loko

@bad_boy Tôi vừa phải đặt dấu thời gian sai trong mô hình ...
Loko

Câu trả lời:


426

Trong mô hình, viết mã dưới đây;

public $timestamps = false;

Điều này sẽ làm việc.

Giải thích: Theo mặc định, laravel sẽ mong đợi cột created_at & update_at trong bảng của bạn. Bằng cách đặt nó thành false, nó sẽ ghi đè cài đặt mặc định.


7
@RameshPareek Nó được ghi trong các tài liệu :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

Trừ khi điều này là dành cho mục đích kiểm toán, tôi không hiểu tại sao điều này là cần thiết để bắt đầu, có lẽ nên tắt theo mặc định và được bật dưới dạng tùy chọn.
OzzyTheGiant

24

Đặt dấu thời gian thành false nghĩa là bạn sẽ mất cả created_at và update_at trong khi bạn có thể đặt cả hai khóa trong mô hình của mình.

Trường hợp 1:

Bạn có created_atcột nhưng không update_at, bạn có thể chỉ cần đặt updated_atthành false trong mô hình của mình

class ABC extends Model {

const UPDATED_AT = null;

Trường hợp 2:

Bạn có cả hai created_atupdated_atcột nhưng với các tên cột khác nhau

Bạn chỉ có thể làm:

class ABC extends Model {

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

Cuối cùng bỏ qua dấu thời gian hoàn toàn:

class ABC extends Model {

public $timestamps = false;

3
đây phải là câu trả lời đúng Đặt dấu thời gian sẽ loại bỏ cả hai trường. Cảm ơn!!!
Sameera K

3
Đây là câu trả lời đúng do trường vừa cập nhật_at trong lỗi hiển thị trong câu hỏi.
Andres Felipe

1
Câu trả lời này là câu trả lời hay nhất
Mojtaba

15

Câu trả lời hay của Alex và Sameer, nhưng có lẽ chỉ cần thêm thông tin về lý do cần thiết để đặt

public $timestamps = false;

Dấu thời gian được giải thích độc đáo trên trang chính thức của Laravel :

Theo mặc định, Eloquent hy vọng các cột created_at và update_at tồn tại trên các bảng> của bạn. Nếu bạn không muốn các cột này tự động được quản lý bởi> Eloquent, hãy đặt thuộc tính $ timestamp trên mô hình của bạn thành false.


14

Đối với những người đang sử dụng laravel 5 trở lên phải sử dụng công cụ sửa đổi công khai khác, nó sẽ tạo ra một ngoại lệ

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

public $timestamps = false;
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.