За последние 24 часа нас посетили 17844 программиста и 1613 роботов. Сейчас ищут 1470 программистов ...

Странные вещи в 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.854
    Симпатии:
    748
    Адрес:
    Татарстан
    Версия 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.854
    Симпатии:
    748
    Адрес:
    Татарстан
    А в коде модели прописаны timestamps?
     
  5. artoodetoo

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

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

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

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

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

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

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