За последние 24 часа нас посетили 20347 программистов и 1662 робота. Сейчас ищут 1022 программиста ...

Странные вещи в MySQL - стали обнуляться поля created_at и updated_at в Laravel 5.5

Тема в разделе "Laravel", создана пользователем xintrea, 12 май 2019.

Метки:
  1. xintrea

    xintrea Активный пользователь

    С нами с:
    25 фев 2019
    Сообщения:
    68
    Симпатии:
    0
    Наблюдаю сейчас неожиданную вещь. В базе данных в разных таблицах некоторые записи получают значения NULL в полях created_at и updated_at. Закономерность понять пока не смог.

    Чаще всего обнулены оба поля:

    http://i.piccy.info/i9/ad763b5e450b658e4547b5414b156191/1557687406/114867/1314571/sql01.png

    Но бывает, что только одно:

    http://i.piccy.info/i9/4d87d0c404978c4d7fd0918491ddf9df/1557687435/30642/1314571/sql02.png

    Это стандартные поля, они должны обрабатываться автоматически. Я их специально не настраиваю, в базу они добавляются просто благодаря стандартной команде timestamps() в миграции:

    Код (Text):
    1.  
    2. Schema::create('my_table', function (Blueprint $table) {
    3.   $table->increments('id');
    4.   $table->timestamps();
    5. ...
    Вроде до какого-то момента, эти поля всегда заполнялись четко. Но сейчас заметил, что они обнуляются. Понять причину не могу.

    Это происходит на двух хостах - и на машине разработчика, и на тестовом сервере. Базы данных, естественно, разные.

    В чем может быть проблема?
     
  2. ADSoft

    ADSoft Старожил

    С нами с:
    12 мар 2007
    Сообщения:
    3.860
    Симпатии:
    750
    Адрес:
    Татарстан
    Версия mysql вроде с 5.7 работает как задумано
     
  3. xintrea

    xintrea Активный пользователь

    С нами с:
    25 фев 2019
    Сообщения:
    68
    Симпатии:
    0
    В общем, проблемное место такое.

    Генерируется такой запрос:
    Код (Text):
    1.  
    2. insert into `notify_channels` (`user`, `channel_type`, `value`, `is_confirm`) values (?, ?, ?, ?) [8, 1, rswind@ya.ru, 1]
    В нем нет времени. И поэтому поля со временем устанавливаются в NULL.

    Его генерит через ORM вот такой код:
    Код (Text):
    1.  
    2. NotifyChannel::insert( [
    3.   'user' => $userId,
    4.   'channel_type' => $emailTypeId,
    5.   'value' => Auth::user()->email,
    6.   'is_confirm' => true
    7. ]);
    Вроде как ORM должен добавлять время (другие такие же ORM-вызовы устанавливают время нормально).

    Особенность этого вызова в том, что он происходит в обработчике события входа пользователя. Файл /app/Listeners/UserEventListener.php, метод handle().

    Еще один QRM-запрос в том же методе тоже не заполняет поля со временем.

    Почему?
     
  4. ADSoft

    ADSoft Старожил

    С нами с:
    12 мар 2007
    Сообщения:
    3.860
    Симпатии:
    750
    Адрес:
    Татарстан
    А в коде модели прописаны timestamps?
     
  5. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.115
    Симпатии:
    1.244
    Адрес:
    там-сям
    @xintrea покажи как выглядит класс-модель. Чтобы таймстампы в eloquent работали, чтобы попадали в генерируемый SQL, надо
    - чтобы НЕбыло public $timestamps = false;
    - чтобы НЕбыло упоминания этих полей в $fillable
    тогда будут работать умолчания насчёт них.
    --- Добавлено ---
    Ну и конечно если где-то ты используешь сырые запросы INSERT/UPDATE, то там ты сам отвечаешь за заполнение этих полей.
     
  6. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.585
    Симпатии:
    1.762
    timestamps заполняются через глобальные наблюдатели. Ты своим запросом не создаёшь экземпляра модели, поэтому они не вызываются.

    Вот прямо точно такие же? По коду вроде видно, что insert не создаёт экземпляра модели.
     
  7. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.115
    Симпатии:
    1.244
    Адрес:
    там-сям