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
,它允许值0
和1
(和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