Подтвердить что ты не робот

Laravel 4 - Получить массив атрибутов из коллекции

У меня есть набор объектов. Скажем, объекты являются тегами:

$tags = Tag::all();

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

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

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

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

4b9b3361

Ответ 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');