Неизвестный столбец Laravel 'updated_at'


160

Я только начал с Laravel и получаю следующую ошибку:

Вставить неизвестный столбец «updated_at» в gebruikers (naam, wachtwoord, updated_at, создал_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;
}

Я должен что-то забыть ... Что я здесь не так делаю?


проверьте свою таблицу, если у вас есть столбец updated_at !
Мехди Магруни

@ MehdiMaghrooni Я не знаю.
Loko

И это проблема, вы хотите получить доступ к столбцу, который даже не существует. Вы должны либо изменить таблицу, чтобы добавить ее, либо просто удалить ее.
Ян

@bad_boy Я даже не использую updated_at где-либо в моем коде.
Loko

@bad_boy Я просто должен был поставить метки времени на ложь в модели ...
Локо

Ответы:


427

В модели напишите приведенный ниже код;

public $timestamps = false;

Это будет работать.

Объяснение: По умолчанию laravel ожидает столбец create_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
Адам

Если это не для целей аудита, я не понимаю, почему это необходимо для начала, вероятно, следует отключить по умолчанию и включить в качестве опции.
OzzyTheGiant

24

Установка меток времени в false означает, что вы потеряете оба create_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
это должен быть правильный ответ. Установка меток времени удаляет оба поля. Спасибо!!!
Самера К

3
Это правильный ответ из-за только что обновленного поля в ошибке, показанной в вопросе.
Андрес Фелипе

1
Этот ответ является одним из лучших вариантов
Mojtaba

15

Хороший ответ Алекса и Самира, но, возможно, просто дополнительная информация о том, почему необходимо поставить

public $timestamps = false;

Временные метки хорошо объяснены на официальной странице Laravel :

По умолчанию Eloquent ожидает, что в ваших> таблицах есть столбцы create_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;
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.