这是一个示例数据库来说明我的问题。我有一个表,其中有一些字段(实际上很多)是可选的,并且没有被设置为任何默认值。所以当我做< / p>
$user = DB::table('users')
->select('*')
->where('id', $user_id)
->first();
为这些字段赋予NULL
["id"]=>
int(120)
["name"]=>
string(4) "jack"
["email"]=>
string(12) "jack@example.com"
["mobile"]=>
string(11) "+4400123456"
["facebook_link"]=>
NULL
["twitter_link"]=>
NULL
["instagram_link"]=>
NULL
["youtube_link"]=>
NULL
这是一个问题,因为我将此作为json API响应发送,而移动团队并不乐意在那里看到空值,他们宁愿选择空字符串(&#39;相反。所以我会在没有手动检查每个字段的情况下进行此操作,就像我正在做的那样
$user->facebook_link = !empty($user->facebook_link)? $user->facebook_link: '';
你可能会说只是分配列可以完成的默认值,但它需要更多的时间,因为它是一个远程数据库。目前我最好的选择是COALESCE但是我希望在laravel本身进行一些调整解决这个问题
答案 0 :(得分:0)
似乎除了在用户模型本身内定义accessor
方法之外别无其他方法:
public function getFacebookLinkAttribute($value)
{
return $value ?: 'default value';
}
使用这种方法,您只需在每个查询中设置一次内部模型而不是COALESCE
。但请记住,当您在代码中访问它时,它将返回默认值。
另一种方法是使用resources
和transformer(fractal)
,它可能不是您需要的,但值得一看。
如果有办法解决这个问题,请纠正我。
答案 1 :(得分:0)
不幸的是,您使用的是QueryBuilder而不是ORM。
所以在ORM中你有多种方法,比如cast或Accessors。
$casts = [
'facebook_link' => 'string'
]
OR
public function getFacebookLinkAttribute($value)
{
return (string)$value;
}