Как отлаживать исключение вставки в laravel 4/cartalyst sentry

Я взялся за проект, написанный на Laravel 4. Есть две системы (dev и production), которые в принципе должны делать одно и то же.

Когда я пытаюсь зарегистрировать пользователя (используется пакет cartalyst/sentry), он работает на производстве. В среде разработки это не удается, так как есть некоторые столбцы, определенные как ненулевые, и в коде нет оператора для его установки. Итак, я понимаю, почему он терпит неудачу, чего я не понимаю, так это того, почему он работает на другой машине, и какие настройки я могу сделать на разработчике, чтобы заставить его работать. Без переделки db-колонок (хочу разобраться в системе, прежде чем вносить такие изменения).

Исключение:

SQLSTATE[HY000]: General error: 1364 Field 'auto_token' doesn't have a default value 
(SQL: insert into `users` (`first_name`, `last_name`, `display_name`, `email`,  
`password`, `updated_at`, `created_at`) values (?, ?, ?, ?, ?, ?, ?)) (Bindings: array ...

Код для регистрации нового пользователя:

        $user = Sentry::register(array(
            'first_name' => Input::get('first_name'),
            'last_name'  => Input::get('last_name'),
            'display_name'=> Input::get('display_name'),
            'email'      => Input::get('email'),
            'password'   => Input::get('password'),
        ));

Схема БД:

id (unsigned int, not null)
first_name (varchar, not null)
last_name (varchar, not null)
display_name (varchar, not null)
email (varchar, not null)
password (varchar, not null)
auto_token (varchar, not null)
... more columns like auto_token

Продукт: MySQL 5.5.42 — PHP 5.4.30 — работает в Linux

Разработчик: MySQL 5.6.21 — PHP 5.4.30 — работает в Windows

Я знаю, что запрос не должен выполняться успешно, во-первых, схема базы данных в целом ошибочна. Я хотел бы узнать, что вызывает это и как решить эту проблему.

Где я застрял, так это в том, почему в одной системе это работает, а в другой нет. Кто-нибудь знает направление?


person hogan    schedule 23.06.2015    source источник


Ответы (1)


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

Найдите файл конфигурации my.cnf или my.ini и удалите STRICT_TRANS_TABLES из значения sql-mode.

Например. до редактирования:
sql-mode=”STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION”

После редактирования:
sql-mode=”NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION”

Вы должны перезапустить mysql после сохранения файла конфигурации, и все, вероятно, будет работать так, как ожидалось.

С другой стороны, отключение «строгого режима» — плохая практика, и лучше отредактировать ваши миграции и добавить nullable или default в нужные места.

Удачи!

person Armen Markossyan    schedule 23.06.2015
comment
Замечательно, 1 ответ - попал точно. Спасибо, иногда я удивляюсь, как на этой планете кто-то может знать такие вещи... - person hogan; 23.06.2015
comment
Пожалуйста. Ничего волшебного, потому что у меня была такая же проблема много раз раньше :) Теперь вы также можете помочь другим людям, когда у них есть похожая проблема. - person Armen Markossyan; 24.06.2015