Условные атрибуты в преобразователях Fractal laravel

Я использую пакет Fractal 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 и возвращаются. Но я хочу, чтобы возвращались только включенные поля. Как мне это сделать ?


person A.B.Developer    schedule 09.12.2017    source источник


Ответы (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 имеет значение null, иначе FALSE.

person ArtisticPhoenix    schedule 09.12.2017