【问题标题】:Laravel 5.8 BIT(1) datatype issueLaravel 5.8 BIT(1) 数据类型问题
【发布时间】:2020-02-26 19:09:32
【问题描述】:

我有一个启用了数据类型 bit(1) 的列。我正在尝试通过 Laravel eloquent 在数据库中保存 0 或 1 个值。

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

我已经在我的配置文件中保存了值。

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

但是当我试图将这些值保存在数据库中时。我遇到了类似的错误,

SQLSTATE[22001]:字符串数据,右截断:1406 对于第 1 行“启用”列的数据太长

当我在 mysql phpmyadmin 中运行查询时,它正确地保存了数据库中的数据。

但是通过 eloquent 运行这个查询,它会产生错误。

【问题讨论】:

  • 看来您正在保存数据''否','是',即不是0或1的字符串
  • 通过做 var_dump($inputs['enabled']);它向我显示 0 或 1。它在 save() 上产生错误;
  • 这能回答你的问题吗? Laravel 4.2 BIT datatype issue

标签: mysql laravel


【解决方案1】:

你需要 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();

【讨论】:

  • 请在您的答案中添加一些解释,以便其他人可以从中学习 - 为什么需要 tinyint?
  • 当您使用 boolean('column_name') 迁移时,它会创建一个类型为 tinyint(1) 的列,您可以将模型设置为 true/1 或 false/0 并保存。例如$model->boolean_field = true; $model->save(); 将与$model->boolean_field = 1; $model->save(); 相同
  • 请通过编辑将所有此类信息添加到您的答案中。不要在评论区解释
【解决方案2】:

根据 MySQL 手册,您可以使用 boolboolean,它们是 tinyint 的别名来存储 0 或 1 值

TINYINT:值为 零被认为是错误的。非零 值被认为是真实的。

所以使用:

$table->tinyInteger('enabled');

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

【讨论】:

    【解决方案3】:

    mysql 中的布尔值通常是 tinyint。

    Eloquent 模型可以自动转换布尔值:https://laravel.com/docs/6.x/eloquent-mutators#attribute-casting

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

    在保存模型之前,请确保您的变量是布尔值

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

    【讨论】:

    • 如果我尝试保存“否”值怎么办?
    • $inputs['enabled']==='Yes' 返回 false 所以它可以工作
    • 基本上我使用下拉菜单选择是或否来分别将 1 或 0 值保存到数据库中。我必须同时处理这两件事。你能指导我吗?
    • 所以你的 $inputs['enabled'] 应该等于 0 或 1 ?在这种情况下,您应该只使用$model->enabled = $inputs['enabled'],它会按预期工作。
    • 感谢您的回复。是的,这样做会返回 0 或 1,但不会通过 $model->save();并产生错误“字符串数据,右截断:1406 Data too long for column 'enabled'”
    【解决方案4】:

    您也可以使用 mutator 强制值。
    示例:在您的模型中,附加:

     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 方法,'enabled' 将变为 1

    文档:https://laravel.com/docs/5.8/eloquent-mutators

    【讨论】:

      【解决方案5】:

      所以我通过添加 DB::raw(); 解决了我的问题;

      喜欢,

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

      Eloquent 不能通过直接调用布尔值来工作,首先你必须在 DB::raw() 中检查你的值;

      它就像一个魅力。

      【讨论】:

        猜你喜欢
        • 2015-02-26
        • 2023-04-03
        • 2012-03-28
        • 2019-09-11
        • 2019-08-11
        • 1970-01-01
        • 1970-01-01
        • 2017-11-02
        • 2020-10-22
        相关资源
        最近更新 更多