Laravel 布尔值在查询中返回“1”/“0”而不是 true/false

Posted

技术标签:

【中文标题】Laravel 布尔值在查询中返回“1”/“0”而不是 true/false【英文标题】:Laravel boolean returns "1"/"0" instead of true/false in query 【发布时间】:2020-03-15 06:10:35 【问题描述】:

我有一个查询,它在我用 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 模型来进行演员阵容。现在您正在使用原始查询直接从表中选择。 【参考方案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';

【讨论】:

以上是关于Laravel 布尔值在查询中返回“1”/“0”而不是 true/false的主要内容,如果未能解决你的问题,请参考以下文章

URL编码参数中的布尔值在Swift3中使用Alamofire编码为0和1

布尔值在活动中第一次返回 false [重复]

(14)awk布尔值比较和逻辑运算

Laravel Eloquent - 更新()函数

单选按钮每次返回 0 布尔值 Laravel 8 Bootstrap

如果行中的初始值在 SQL 中为 < 或 > 0,如何返回单独的列总和