Laravel: Столбец остается NULL при вставке на сервере, но не на моей локальной машине

Вопрос или проблема

Мой скрипт (задание Laravel) берет путь загруженного файла (.pdf) и преобразует его в имя файла .jpg. Когда скрипт вставляет все в базу данных, все поля добавляются корректно, за исключением img_name, который остается null. Когда я логирую переменную на строке выше вставки, она отображается в логах. Я добавил имя столбца в переменную fillable в модели.

Смешно то, что это происходит только в продакшене, а не на моем локальном компьютере. Схема базы данных идентична. Мои знания о Laravel довольно ограничены, так как я использую его всего пару недель.

Задание:

        $img_name = str_replace('.pdf', '.jpg', explode("https://stackoverflow.com/", $this->filePath)[1]);
        Log::info('Сгенерированное имя изображения: ', ['img_name' => $img_name]);

        // Сохранение извлеченного текста и информации о файле в базе данных
        Log::info('Сохранение резюме в базе данных для пользователя: ', ['user_id' => $this->user->id]);
        $cv = Cv::create([
            'user_id' => $this->user->id,
            'long_text' => $cv_text,
            'file_name' => $this->fileName,
            'img_name' => $img_name,
            'date_added' => now(),
        ]);

        Log::info('Резюме сохранено в базе данных с ID: ', ['cv_id' => $cv->id]);

Логи:

[2024-09-24 15:29:06] production.INFO: Сгенерированное имя изображения:  {"img_name":"DM7conE9bnBwV8xg8ETTsojWl0Mk1FgdxfK8alyZ.jpg"} 
[2024-09-24 15:29:06] production.INFO: Сохранение резюме в базе данных для пользователя:  {"user_id":10} 
[2024-09-24 15:29:06] production.INFO: Резюме сохранено в базе данных с ID:  {"cv_id":82} 

Модель:

protected $fillable = ['user_id', 'long_text', 'file_name', 'img_name', 'date_added'];
  • Я пытался логировать переменную, чтобы увидеть, корректно ли она установлена – да, установлена.
  • Я пытался переименовать столбец и добавить новый столбец, чтобы добавить img_name – это дало такую же проблему.
  • Я пытался обновить кеш – это не сработало.

Ответ или решение

Проблема, с которой вы столкнулись, когда поле img_name вставляется как NULL на производственном сервере, может быть вызвана несколькими факторами. Давайте рассмотрим несколько возможных причин и их решения.

1. Проверка конфигурации базы данных

Убедитесь, что конфигурация базы данных на производственном сервере соответствует вашей локальной среде. Проверьте, что вы используете ту же версию MySQL или другого СУБД, а также, что структура таблицы полностью идентична. Выполните команду SHOW CREATE TABLE cv; на обоих серверах, чтобы сравнить структуру таблицы.

2. Проверьте транзакции

Если ваш код содержит транзакции и они не завершены или откатаны, это может привести к тому, что данные не будут вставлены. Проверьте, нет ли в вашей программе использования транзакций, которые могли бы вызвать эту проблему.

3. Проверка доступных форматов данных

Убедитесь, что тип данных колонки img_name в вашей таблице базы данных соответствует тому, что вы пытаетесь вставить. Например, если столбец определяется как VARCHAR(50) и вы пытаетесь вставить строку длиной более 50 символов, это может привести к ошибке.

4. Ошибки валидации

Если у вас в коде установлены правила валидации, убедитесь, что значение $img_name удовлетворяет этим правилам. Если валидация не проходит, значения могут не попасть в базу данных.

5. Логирование и отладка

Судя по вашим логам, значение img_name формируется корректно. Однако добавьте дополнительные логи перед вызовом Cv::create() для проверки всех переменных:

Log::info('Values before insert: ', [
    'user_id' => $this->user->id,
    'long_text' => $cv_text,
    'file_name' => $this->fileName,
    'img_name' => $img_name,
    'date_added' => now(),
]);

6. Обновление кеша

Если вы изменяли коды или настройки с помощью php artisan, убедитесь, что вы очистили кеш приложения:

php artisan config:cache
php artisan cache:clear
php artisan view:clear

7. Проверка модели

Убедитесь, что у вас правильно установлено свойство $fillable в вашей модели Cv. Вы уже включили img_name, убедитесь, что оно не помечено в модели как hidden или не имеет каких-либо других ограничений.

Заключение

После выполнения всех предложенных шагов, если проблема все еще не решена, попробуйте отладить процесс вставки с помощью дебаггера или временной записи данных в файл перед попыткой вставки в базу данных. Это поможет вам более точно идентифицировать, где могут происходить проблемы.

Если ни одно из предложенных решений не помогло, попробуйте установить более строгие логи на уровне базы данных, чтобы проверить, какие запросы фактически выполняются и что происходит с данными на уровне SQL.

Удачи в решении вашей проблемы!

Оцените материал
Добавить комментарий

Капча загружается...