Laravel 5.8 BIT (1) проблема с типом данных - PullRequest
0 голосов
/ 25 февраля 2020

У меня включен столбец с битом типа данных (1). Я пытаюсь сохранить 0 или 1 значение в базе данных с помощью Laravel eloquent.

$model->enabled = $inputs['enabled'];
$model->save();

Я сохранил значения в моем файле конфигурации.

'enabled' => [
    '0' => 'No',
    '1' => 'Yes',
],

Но когда я попытался сохранить эти значения в базе данных. Я получаю сообщение об ошибке типа

SQLSTATE [22001]: строковые данные, усеченные справа: 1406 Слишком длинные данные для столбца «включен» в строке 1

при запуске запрос в mysql phpmyadmin, он правильно сохранил базу данных.

Но, выполнив этот запрос красноречиво, выдает ошибку.

Ответы [ 5 ]

1 голос
/ 25 февраля 2020

Согласно MySQL руководству, которое вы можете использовать, следует использовать bool и boolean, которые являются псевдонимами tinyint для хранения значения 0 или 1

TINYINT: значение ноль считается ложным. Ненулевые значения считаются истинными.

Поэтому используйте:

$table->tinyInteger('enabled');

https://dev.mysql.com/doc/refman/8.0/en/other-vendor-data-types.html

1 голос
/ 25 февраля 2020

вам нужен тип tinyint, в вашем файле миграции выполните

$table->boolean('enabled')->default(false);

. При миграции с boolean('column_name') создается столбец с типом tinyint (1), и вы можете установить для модели true / 1 или false / 0 и сохранить. Например

$model->boolean_field = true;
$model->save();

Или

$model->boolean_field = 1;
$model->save();
0 голосов
/ 26 февраля 2020

Итак, я решил свой вопрос, просто добавив DB :: raw ();

например,

$model->enabled = DB::raw($inputs['enabled']);
$model->save();

Eloquent не работает, напрямую вызывая логическое значение, сначала у вас есть чтобы просмотреть ваши значения в DB :: raw ();

Это работает как шарм.

0 голосов
/ 25 февраля 2020

также вы можете использовать мутатор для принудительной установки значений.
пример: в вашей модели добавьте:

 public function setEnabled($value) // note the E in uppercase.
    {
        if ($value=='YES') { $this->attributes['enabled'] = 1;
        if ($value=='NO')  { $this->attributes['enabled'] = 0;
        if ($value=='1')  { $this->attributes['enabled'] = 1;
        if ($value=='0')  { $this->attributes['enabled'] = 0;
        // etc...
        // the logic can be improved... yes/YES/No/no/0/1/empty/null/ etc..
    }

и в коде клиента

   $model->enabled = 'YES'; // || 'NO' || etc..,  : note the e in lowercase.

, тогда метод setEnabled будет вызывается во время назначения и «включен» станет 1

do c: https://laravel.com/docs/5.8/eloquent-mutators

0 голосов
/ 25 февраля 2020

Логическое значение в mysql обычно является крошечным.

Красноречивые модели могут автоматически использовать логическое значение: https://laravel.com/docs/6.x/eloquent-mutators#attribute -кастинг

protected $casts = [
    'enabled' => 'boolean',
];

Перед сохранением модель, убедитесь, что ваша переменная - логическое значение

$model->enabled = $inputs['enabled']==='Yes';
$model->save();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...