Преобразование NULL, полученного от построителя запросов, в пустые строки в Laravel - PullRequest
0 голосов
/ 30 апреля 2018

enter image description here

Это примерная база данных, иллюстрирующая мою проблему. У меня есть таблица, в которой есть некоторые поля (на самом деле многие), которые являются необязательными и для которых не задано какое-либо значение по умолчанию. Очевидно, когда я делаю

$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

, что является проблемой, так как я отправлю это как ответ API json, и мобильная команда не очень рада видеть там нулевое значение, вместо этого они предпочли бы пустую строку (''). сделайте это, не проверяя вручную каждое поле, как я сейчас делаю

$user->facebook_link = !empty($user->facebook_link)? $user->facebook_link: '';

Вы можете сказать, просто назначьте столбцам значения по умолчанию, что можно сделать, но это займет больше времени, так как это удаленная база данных. В настоящее время моя лучшая ставка - COALESCE, но я надеюсь на некоторую подстройку в самом laravel, которая решит эту проблему.

Ответы [ 2 ]

0 голосов
/ 30 апреля 2018

К сожалению, вы используете QueryBuilder, а не ORM.

Итак, в ORM у вас есть несколько подходов, таких как приведение типов или методы доступа.

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

ИЛИ

public function getFacebookLinkAttribute($value)
{
  return (string)$value; 
}
0 голосов
/ 30 апреля 2018

Похоже, что нет другого способа, кроме как определить метод accessor внутри самой пользовательской модели:

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

При таком подходе вам нужно только один раз установить внутри модели, а не COALESCE для каждого запроса. Но помните, он вернет значение по умолчанию при обращении к нему внутри вашего кода.

Другим подходом будет использование resources и transformer(fractal), возможно, это не то, что вам нужно, но стоит посмотреть на это.

Поправь меня, если есть способ справиться с этим.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...