2017-02-09 2 views
0

У меня есть модель (например, User).Получить определенные атрибуты из модели Eloquent при преобразовании в массив в Laravel

можно легко преобразовать его в массив следующим образом:

$user->toArray() 

Однако, это дает все атрибуты. Мне нужны только атрибуты x, y и z.

Мы можем использовать hidden и visible атрибуты модели, чтобы скрыть/показать значения, как описано здесь: https://laravel.com/docs/5.4/eloquent-serialization#hiding-attributes-from-json

Однако, я не хочу использовать это, потому что это более один от ситуации. Не является обычным явлением.

Метод pluck идеален, но это относится только к коллекциям, а не к моделям.

+1

вы можете вернуть [$ user-> x, $ user-> y, $ user-> z] или настроить с помощью локальных областей https://laravel.com/docs/5.4/eloquent#local-scopes – MarcosRJJunior

ответ

2

Вы можете переопределить метод toArray() и разрешить ему принимать массив полей, которые вы хотите вернуть.

public function toArray(array $fields = []) 
{ 
    // Get the full, original array. 
    $original = parent::toArray(); 

    // If no fields are specified, return the original array. 
    // This ensures that all existing code works the same 
    // way as before. 
    if (empty($fields)) { 
     return $original; 
    } 

    // Return an array containing only those fields specified 
    // by the input parameter. 
    return array_key_intersect($original, array_flip($fields)); 
} 

С помощью этого метода переопределен в модели пользователя, теперь вы можете иметь следующий код:

// Will return an array with all the fields. 
$full = $user->toArray(); 

// Will return an array with only x, y, and z fields. 
$partial = $user->toArray(['x', 'y', 'z']); 

NB: Поскольку это вызывает метод родительского toArray(), этот метод замещения будет по-прежнему уважать атрибут $hidden , Итак, если y скрыт, и вы вызываете $user->toArray(['x', 'y', 'z']);, результирующий массив не будет содержать значение y.

Смежные вопросы