2013-08-06 4 views
34

У меня есть коллекция объектов. Скажем, объекты являются тегами:Laravel 4 - Получить массив атрибутов из коллекции

$tags = Tag::all(); 

Я хочу получить определенный атрибут для каждого тега, скажем его имя. Конечно, я могу сделать

foreach ($tags as $tag) { 
    $tag_names[] = $tag->name; 
} 

Но есть ли более ларановое решение этой проблемы?

Нечто вроде $tags->name?

+0

'$ теги-> name' должен работать –

+0

Я также надеялся на первый, но это не так:' не определено свойство: загоритесь \ Database \ Красноречивый \ Коллекция :: $ name' – severin

+0

Теги @severin $ - это совокупность объектов, а не один объект с свойством name. Вам нужно пройти через теги $, чтобы получить каждое имя тега. Не имеет смысла получить свойство name из тегов. Как он предположит, какое имя свойства вы хотите напечатать. –

ответ

68

Коллекции имеют метод lists, аналогичный методу для таблиц, описанных компанией @Gadoma.Он возвращает массив, содержащий значение данного атрибута для каждого элемента коллекции.

Чтобы получить нужный массив имен из моей коллекции тэгов я могу просто использовать:

$tags->lists('name'); 

Обновление: По Laravel 5,2lists заменяется pluck.

$tags->pluck('name'); 

Более конкретно, laravel 5.2 upgrade guide утверждает, что «[т] он lists метод по сбору данных, построитель запросов и красноречивым объектов конструктор запросов был переименован в pluck. Метод подписи остается тем же.»

+0

Метод 'lists' - очень хороший вывод. –

+1

В случае создания формы выбора html списки работают слишком хорошо: 'Form :: select ('subcategory', array (null => 'Please Select') + $ category-> firstSubcategories-> lists ('name', 'id')) ' – RY35

+1

@BishalPaudel или вы можете сделать' $ firsSubcategories = $ category-> firstSubcategories-> lists ('name', 'id'); 'в контроллере, затем' Form :: select ('subcategory' , массив (null => 'Please Choose') + $ firsSubcategories) ', в лезвии, все равно. – briankip

3

Для этого вы можете использовать array_column (это функция PHP 5.5, но Laravel имеет вспомогательную функцию, которая по большей части реплицирует поведение).

Что-то вроде этого должно быть достаточно.

$tag_names = array_column($tags->toArray(), 'name'); 
+0

Спасибо. Это работает. Однако я думаю, что метод «списков» еще более ларален. – severin

+0

Ах, конечно, я всегда забываю о «списках». –

25

Да, вы можете сделать это приятно и легко. Как Laravel 4 Documentation states, вы можете сделать

Получение всех строк из таблицы

$users = DB::table('users')->get(); 

foreach ($users as $user) 
{ 
var_dump($user->name); 
} 

Извлечение одной строки из таблицы

$user = DB::table('users')->where('name', 'John')->first(); 

var_dump($user->name); 

Получение одного столбца из строки

$name = DB::table('users')->where('name', 'John')->pluck('name'); 

Получение списка Column значения

$roles = DB::table('roles')->lists('title'); 

Этот метод возвращает массив названий ролей. Вы также можете указать столбец пользовательского ключа для возвращаемого массива:

$roles = DB::table('roles')->lists('title', 'name'); 

Указание ЗЕЬЕСТ

$users = DB::table('users')->select('name', 'email')->get(); 

$users = DB::table('users')->distinct()->get(); 

$users = DB::table('users')->select('name as user_name')->get(); 

EDIT:

Приведенные выше примеры показывают, как получить доступ данных с помощью свободно создаваемого конструктора запросов Laravel. Если вы используете модели вы можете получить доступ к данным с Laravel's Eloquent ORM

Поскольку Красноречивым является internaly с помощью конструктора запросов, вы можете без проблем сделать следующие вещи:

$tag_names = $tags->lists('tag_name_label', 'tag_name_column')->get(); 

, который может быть также сделано с:

$tag_names = DB::table('tags')->lists('tag_name_label', 'tag_name_column')->get(); 
+0

Спасибо. Это фактически привело меня к соответствующему решению, но, похоже, существует некоторая путаница в вашем ответе между методами БД и методами, которые применяются к коллекциям. – severin

+0

Отредактировано согласно вашему комментарию. С уважением, – Gadoma

+0

Думаю, в вашем Редактировании должно быть Tag :: lists ('tag_name_label') -> get(); – Anji

7

Вот несколько фрагментов из моих собственных экспериментов по этому вопросу сегодня утром. Я только хочу (и, может быть, кто-то еще знает решение), что у Collection был метод $ collection-> distinct(), поэтому я мог легко сгенерировать список значений столбцов на основе уже отфильтрованной коллекции.

Мысли?

Я надеюсь, что эти фрагменты помогут прояснить некоторые альтернативные варианты для создания списка уникальных значений из таблицы, коллекции и яркой модели.

Использование коллекции (Happy)

/** 
* Method A 
*  Store Collection to reduce queries when building multiple lists 
*/ 
$people = Person::get(); 
$cities = array_unique($people->lists('city')); 
$states = array_unique($people->lists('state')); 
// etc... 

Использование Красноречивый модели (Счастливее)

/** 
* Method B 
*  Utilize the Eloquent model's methods 
*  One query per list 
*/ 
// This will return an array of unique cities present in the list 
$cities = Person::distinct()->lists('city'); 
$states = Person::distinct()->lists('state'); 

Использование Красноречивый модели PLUS Caching (Happiest)

/** 
* Method C 
*  Utilize the Eloquent model's methods PLUS the built in Caching 
*  Queries only run once expiry is reached 
*/ 
$expiry = 60; // One Hour 
$cities = Person::remember($expiry)->distinct()->lists('city'); 
$states = Person::remember($expiry)->distinct()->lists('state'); 

Я хотел бы услышать некоторые альтернативы этому, если у вас есть один!

@ErikOnTheWeb

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