Условные атрибуты в фрактальных трансформаторах Laravel

я использую Фрактальная упаковка Laravel как слой представления и преобразования для сложного вывода данных.

Я написал UserTransformer как это :

public function transform(User $user)
{
return [
'user_id'            => (int)$user->user_id,
'name'               => $user->name,
'family'             => $user->family,
'username'           => $user->username,
'token'              => $user->token,
'mobile'             => $user->mobile,
'email'              => $user->email,
'sex'                => $user->sex,
'tel'                => $user->tel,
'province'           => $user->province,
'city'               => $user->city,
'picture'            => $user->picture,
'birthday'           => $user->birthday,
'wedding_date'       => $user->wedding_date,
'wife_birthday'      => $user->wife_birthday,
'desc'               => $user->desc,
'active'             => (bool) $user->active,
'supervisor'         => $user->supervisor,
'two_factor_enabled' => (bool) $user->two_factor_enabled,
'address'            => $user->address,
'created_at'         => $user->created_at,
];
}

Теперь в какой-то ситуации я хочу вернуть конкретные поля User Модель как коллекция, как это:

public function index()
{
return $this->collection(User::get(['user_id','name','family','username','created_at']), new UserTransformer());
}

Но в этом случае результат выглядит так:

"result": [
{
"user_id": 1,
"name": "ahmad",
"family": "badpey",
"username": "09139616246",
"token": null,
"mobile": null,
"email": null,
"sex": null,
"tel": null,
"province": null,
"city": null,
"picture": null,
"birthday": null,
"wedding_date": null,
"wife_birthday": null,
"desc": null,
"active": false,
"supervisor": null,
"two_factor_enabled": false,
"address": null,
"created_at": {
"date": "2017-11-15 10:01:24.000000",
"timezone_type": 3,
"timezone": "Asia/Tehran"}
}
]

Как вы можете видеть поля, которые не включены в выбор User модель, есть null Значение и вернулся. Но я хочу, чтобы только включенные поля возвращались. Как мне это сделать ?

1

Решение

Используйте фильтр массива, чтобы удалить их, что-то вроде этого

public function transform(User $user)
{
return array_filter([
'user_id'            => (int)$user->user_id,
'name'               => $user->name,
'family'             => $user->family,
'username'           => $user->username,
'token'              => $user->token,
'mobile'             => $user->mobile,
'email'              => $user->email,
'sex'                => $user->sex,
'tel'                => $user->tel,
'province'           => $user->province,
'city'               => $user->city,
'picture'            => $user->picture,
'birthday'           => $user->birthday,
'wedding_date'       => $user->wedding_date,
'wife_birthday'      => $user->wife_birthday,
'desc'               => $user->desc,
'active'             => (bool) $user->active,
'supervisor'         => $user->supervisor,
'two_factor_enabled' => (bool) $user->two_factor_enabled,
'address'            => $user->address,
'created_at'         => $user->created_at,
], function($item){
return !is_null($item);
});
}

Как примечание, я не использую Laravel, однако, как правило, именно так вы массово удаляете вещи из массива.

http://php.net/manual/en/function.array-filter.php

Итерирует по каждому значению в массиве, передавая их функции обратного вызова. Если функция обратного вызова возвращает true, текущее значение из массива возвращается в массив результатов. Ключи массива сохранены.

А также

http://php.net/manual/en/function.is-null.php

Находит, является ли данная переменная NULL. Возвращает TRUE, если var равен нулю, FALSE в противном случае.

3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]