【问题标题】:Laravel boolean returns "1"/"0" instead of true/false in queryLaravel 布尔值在查询中返回“1”/“0”而不是 true/false
【发布时间】:2024-04-16 04:15:01
【问题描述】:

我有一个查询,它在我用 Laravel 开发的 REST API 上返回一个布尔字段(顺便说一下,我在 SQL Server 上),几天前它返回的值是真/假,但现在它将该布尔值作为字符串返回:“1”/“0”。

你知道它是什么吗?

我尝试像这样在我的模型上使用强制转换:

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

这是我的查询:

return DB::table('dbo.visits as V')
        ->leftJoin('dbo.reports AS R', 'R.id_visit', '=', 'V.id')
        ->select('R.id','R.status'); // status is the boolean

提前致谢。

【问题讨论】:

  • 您将其存储为什么数据类型,bit
  • SQL Server 没有boolean 数据类型,因此您不能有一个返回一个的查询。如果要存储值TRUE/FALSE,则必须使用varchar(5) 以及值'true''false'。然而,大多数人使用bit,它允许值01(和NULL),但是它不像布尔值作用
  • 是的,存储为位
  • 考虑使用 Eloquent,您可以将属性转换为布尔值 laravel.com/docs/6.x/eloquent-mutators#attribute-casting
  • 我认为你需要使用 Eloquent 模型来进行演员阵容。现在您正在使用原始查询直接从表中选择。

标签: php sql-server laravel eloquent laravel-query-builder


【解决方案1】:

当您定义以下内容时:

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

您在模型上定义它。但是,当您使用 DB::table() 启动查询时,您没有使用模型,因此绑定实际上并不适用。使用您的模型启动查询:

return Visit::leftJoin('dbo.reports AS R', 'R.id_visit', '=', 'dbo.visits.id')
->select('R.id','R.status'); // status is the boolean

注意:由于此时别名不可用,因此必须将查询从 V.id 调整为 dbo.visits.id

【讨论】:

    【解决方案2】:

    当您使用 Eloquent 模型时,定义转换是有效的。在您提供的代码中,您使用了查询构建器,然后根本不使用 Eloquent 模型,因此没有进行强制转换。

    【讨论】:

      【解决方案3】:

      您想要做的是将此功能添加到您的模型中。每次使用模型检索数据时,都会调用与属性名称匹配的函数,将数据库中的原始数据转换为所需的格式。

      public function getStatusAttribute($value)
      {
              return $value ? 'Yes' : 'No';
      }
      

      【讨论】: