Невідомий стовпець Laravel 'оновлено_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;
}

Я, мабуть, щось забуваю ... Що я тут роблю неправильно?


перевірте свою таблицю, чи є у вас стовпчик оновлений_at !
Мехді Магріуні

@MehdiMaghrooni Я не хочу.
Локо

І в цьому проблема, ви хочете отримати доступ до стовпця, який навіть не існує. Ви повинні або змінити свою таблицю, щоб додати її, або просто видалити її.
Ян

@bad_boy Я навіть не використовую updated_at ніде в коді.
Локо

@bad_boy Мені просто довелося ставити помилки часу у фальшивій моделі
Loko

Відповіді:


426

У моделі запишіть код нижче;

public $timestamps = false;

Це спрацювало б.

Пояснення: за замовчуванням laravel очікує створений стовпчик_at & updated_at у вашій таблиці. Перетворюючи його на помилковий, він замінить налаштування за замовчуванням.


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

Якщо встановити часові позначки на помилкові, ви втратите і створений_at, і оновлений_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
це має бути правильна відповідь. Встановлення часових позначок видаляє обидва поля. Дякую!!!
Sameera K

3
Це правильна відповідь через щойно оновлене поле_at у помилці, показаній у запитанні.
Андрес Феліпе

1
Ця відповідь є одним з найкращих варіантів
Mojtaba

15

Приємна відповідь Алекса та Самера, але, можливо, лише додаткова інформація про те, чому потрібно ставити

public $timestamps = false;

На офіційній сторінці Laravel добре пояснюються часові позначки :

За замовчуванням Eloquent очікує, що у ваших> таблицях будуть існувати стовпці create_at та updated_at. Якщо ви не хочете, щоб цими стовпцями автоматично керував "Красномовний", встановіть властивість $ 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.