LINUX.ORG.RU

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

 , , , ,


0

1

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

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

http://i.piccy.info/i9/ad763b5e450b658e4547b5414b156191/1557687406/114867/131...

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

http://i.piccy.info/i9/4d87d0c404978c4d7fd0918491ddf9df/1557687435/30642/1314...

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

Schema::create('my_table', function (Blueprint $table) {
  $table->increments('id');
  $table->timestamps();
...


Вроде до какого-то момента, эти поля всегда заполнялись четко. Но сейчас заметил, что они обнуляются. Понять причину не могу.

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

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

★★★★★

Может какие-то записи вставляются в обход ORM. Может где то есть $model->fill(...) и там есть даты, и оно перезаписывается при апдейте на null.

goingUp ★★★★★
()
Ответ на: комментарий от Anoxemian

Блин, не могу включить логирование. Делаю так:

https://artisansweb.net/how-to-log-query-in-laravel/

Open the app/Providers/AppServiceProvider.php file, and add 2 Facadaes for File and DB as follows.

use Illuminate\Support\Facades\File;
use Illuminate\Support\Facades\DB;

Next, in the boot() method we will write a below code which logs all your Laravel queries in the background.

public function boot()
{
if(env('APP_DEBUG')) {
DB::listen(function($query) {
File::append(
storage_path('/logs/query.log'),
$query->sql . ' [' . implode(', ', $query->bindings) . ']' . PHP_EOL
);
});
}
}

Now, whenever query executed it will log in the storage/logs/query.log file and you can directly view the queries from this log file.



Файл /storage/logs/query.log не создается (другие логи в этом же каталоге есть), в общем логе Laravel (laravel.log) пусто.

Что делаю не так?

Xintrea ★★★★★
() автор топика
Ответ на: комментарий от Anoxemian

В php-логе (/var/log/php7.0-fpm.log) за последний час ошибок нет.

В nginx-логе (/var/log/nginx/error.log) ошибок за этот день нет.

В mysql-логе (/var/log/mysql/error.log) за последний час ошибок нет.

Блин, где еще смотреть?

Xintrea ★★★★★
() автор топика
Ответ на: комментарий от Xintrea

ну значит перечитывай инструкцию как включить логирование запросов.

if(env('APP_DEBUG')) {

вот этот иф удали, явно у тебя эвайромент в продакшен выставлен

Anoxemian ★★★★★
()
Ответ на: комментарий от Xintrea

чудес не бывает. если есть 1 иф и код отрабатывает без ошибок.... удали просто и смотри лог.

Anoxemian ★★★★★
()
Ответ на: комментарий от Anoxemian

Странно, функция env() некорректно работает. А вот так сработало:

if (config('app.debug')) {


Но в лог попадают SQL-запросы с плейсхолдерами, а самих плейсхолдеров нет:

select * from `users` where `id` = ? limit 1 [3]
delete from `notify_channels` where `user` = ? and `is_confirm` = ? [3, ]
select * from `notify_channels` where `user` = ? [3]
select `title`, `id` from `channel_types` order by `sort_order` asc []


Как бы залогировать запросы в явном виде?

Xintrea ★★★★★
() автор топика
Последнее исправление: Xintrea (всего исправлений: 1)
Ответ на: комментарий от Xintrea

ну тут не помогу. закодь вручную склейку запроса.

как вариант -

general_log_file = /var/log/mysql/mysql.log
general_log = 1

в конфиг мускуля, стопудовочка, чтобы в говнокоде не копошиться

Anoxemian ★★★★★
()
Ответ на: комментарий от Anoxemian

В общем, проблемное место такое.

Генерируется такой запрос:

insert into `notify_channels` (`user`, `channel_type`, `value`, `is_confirm`) values (?, ?, ?, ?) [8, 1, rswind@ya.ru, 1]

В нем нет времени. И поэтому поля со временем устанавливаются в NULL.

Его генерит через ORM вот такой код:
NotifyChannel::insert( [
  'user' => $userId,
  'channel_type' => $emailTypeId,
  'value' => Auth::user()->email,
  'is_confirm' => true
]);

Вроде как ORM должен добавлять время (другие такие же ORM-вызовы устанавливают время нормально).

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

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

Почему?

Xintrea ★★★★★
() автор топика
Ответ на: комментарий от Xintrea

вопрос не туда. ну так докодь, сам же привел инсерт. но я бы поставил на косяк в схеме. дефолт не NULL должен быть, а, видимо, NOW().

Anoxemian ★★★★★
()
Ответ на: комментарий от Xintrea

Попробуй через new NotifyChannel() и save. ЕМНИП NotifyChannel::insert не делает никаких дополнительных манипуляций, что есть в ORM, это метод конструктора запросов.

goingUp ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.