Laravel 4 - Получить массив атрибутов из коллекции
У меня есть набор объектов. Скажем, объекты являются тегами:
$tags = Tag::all();
Я хочу получить определенный атрибут для каждого тега, скажем его имя. Конечно, я могу сделать
foreach ($tags as $tag) {
$tag_names[] = $tag->name;
}
Но есть ли более ларенское решение этой проблемы?
Что-то вроде $tags->name
?
Ответы
Ответ 1
Коллекции имеют метод lists
, аналогичный методу таблиц, описанных @Gadoma. Он возвращает массив, содержащий значение данного атрибута для каждого элемента в коллекции.
Чтобы получить желаемый массив имен из моей коллекции тегов, я могу просто использовать:
$tags->lists('name');
Обновление:. По сравнению с laravel 5.2 lists
заменяется на pluck
.
$tags->pluck('name');
В частности, в руководстве по обновлению laravel 5.2 указано, что метод [t] he lists
в объектах Collection, query builder и Eloquent builder был переименован до pluck
. Подпись метода остается той же. "
Ответ 2
Да, вы можете сделать это красиво и легко. Поскольку Laravel 4 Documentation заявляет, вы можете сделать
Получение всех строк из таблицы
$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');
Получение списка значений столбцов
$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 Rloquent ORM
Поскольку Eloquent внутренне использует построитель запросов, вы можете без проблем выполнить следующие действия:
$tag_names = $tags->lists('tag_name_label', 'tag_name_column')->get();
который также можно выполнить с помощью
$tag_names = DB::table('tags')->lists('tag_name_label', 'tag_name_column')->get();
Ответ 3
Вот несколько фрагментов моего собственного эксперимента по этому вопросу сегодня утром. Я только хочу (и, может быть, кто-то еще знает решение), что у 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 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');
Использование Eloquent Model PLUS Caching (самый счастливый)
/**
* Method C
* Utilize the Eloquent model 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
Ответ 4
Вы можете использовать array_column
для этого (это функция PHP 5.5, но у Laravel есть вспомогательная функция, которая по большей части реплицирует поведение).
Что-то вроде этого должно быть достаточно.
$tag_names = array_column($tags->toArray(), 'name');