将从查询生成器接收的NULL转换为Laravel中的空字符串

时间:2018-04-30 08:02:49

标签: php laravel

enter image description here

这是一个示例数据库来说明我的问题。我有一个表,其中有一些字段(实际上很多)是可选的,并且没有被设置为任何默认值。所以当我做< / 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本身进行一些调整解决这个问题

2 个答案:

答案 0 :(得分:0)

似乎除了在用户模型本身内定义accessor方法之外别无其他方法:

public function getFacebookLinkAttribute($value)
{
  return $value ?: 'default value';
}

使用这种方法,您只需在每个查询中设置一次内部模型而不是COALESCE。但请记住,当您在代码中访问它时,它将返回默认值。

另一种方法是使用resourcestransformer(fractal),它可能不是您需要的,但值得一看。

如果有办法解决这个问题,请纠正我。

答案 1 :(得分:0)

不幸的是,您使用的是QueryBuilder而不是ORM。

所以在ORM中你有多种方法,比如cast或Accessors。

$casts = [
    'facebook_link' => 'string'
]

OR

public function getFacebookLinkAttribute($value)
{
  return (string)$value; 
}