Рубрики
Uncategorized

Учебное пособие: Основы использования коллекции Laravel

Автор оригинала: David Wong.

От: https://learnku.com/ларавель/т…

Дополнительные статьи: https://learnku.com/laravel/c…

Коллекция Laravel-очень полезный инструмент в рамках Laravel.

Коллекции Laravel похожи на массивы в PHP, но они работают лучше.

В этом уроке мы познакомимся с некоторыми практическими приемами использования коллекций.

Коллекция

Класс Illuminate\Support\Collection обеспечивает удобную инкапсуляцию операционных массивов.

Класс aggregate Collection реализует некоторые интерфейсы между PHP и Laravel, такие как:

  • ArrayAccess – Интерфейс для управления объектами массива.
  • Агрегат итераторов – Интерфейс для создания внешних итераторов.
  • JsonSerializable

Вы можете увидеть остальные реализованные интерфейсы здесь.

Создайте новую коллекцию

Можно использовать коллекцию collect() Функции справки создаются на основе массива или передаются напрямую. Осветить\Поддержка\Коллекция Создание экземпляра класса.

Очень простое использование collect() Примеры функций справки:

$newCollection = collect([1, 2, 3, 4, 5]);

Более сложный пример:

php

namespace app\Http\Controllers;

use Illuminate\Support\Collection;

class TestController extends Controller
{
    /**
     * Create a new collection using the collect helper method.
     */
    public function helperCollection()
    {
        $newCollection = collect([1, 2, 3, 4, 5]);
        dd($newCollection);
    }

    /**
     * Create a new collection with a Collection class instance.
     */
    public function classCollection()
    {
        $newCollection = new Collection([1, 2, 3, 4, 5]);
        dd($newCollection);
    }
}

Эта функция справки намного проще в использовании, потому что вам больше не нужно создавать ее экземпляр. Осветить\Поддержка\Коллекция Класс.

Я тоже полезен. dd() Справочные функции для отображения коллекций в браузерах. Это выглядит так.

Красноречивый набор ОРМ

Laravel Eloquent ORM также возвращает данные в виде коллекции.

Вызовы красноречивого ORM возвращают данные в виде коллекций

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

Мы создадим пользовательскую таблицу с файлом миграции, заданным платформой Laravel, а затем заполним 10 фрагментов данных в пользовательскую таблицу.

/**
     * Get the user list from the user table
     */
    public function getUsers()
    {
        $users = User::all();
        dd($users);
    }

Метод контроллера возвращает коллекцию Laravel всех пользователей, как показано ниже.

Вы можете легко получить доступ к атрибутам коллекции с помощью символов со стрелками. Что касается примеров, вы хотите получить $users Имя первого пользователя в коллекции, что мы можем сделать.

/**
     * Get the name of the first user
     */
    public function firstUser()
    {
        $user = User::first();
        dd($user->name);
    }

Создайте нашу коллекцию образцов

Мы будем использовать некоторые из наиболее полезных методов манипулирования наборами, и вы, безусловно, найдете их очень полезными.

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

Array
(
    [0] => Array
        (
            [id] => 1
            [name] => Chasity Tillman
            [email] => [email protected]
            [age] => 51
            [created_at] => 2016-06-07 15:50:50
            [updated_at] => 2016-06-07 15:50:50
        )
    ...
)

Поиск данных

Существует несколько способов поиска данных в коллекции.

содержит

содержит() Метод может передавать одно значение, или набор пар ключ/значение, или функцию обратного вызова, а затем возвращает логическое значение, чтобы определить, находится ли целевой контент в коллекции.

/**
     * Determine whether the key/value pair or callback content exists in the collection
     *
     *
     * @return true or false
     */
    public function contains()
    {
        $users = User::all();
        $users->contains('name', 'Chasity Tillman');
        //true

        $collection = collect(['name' => 'John', 'age' => 23]);
        $collection->contains('Jane');
        //false

        $collection = collect([1, 2, 3, 4, 5]);
        $collection->contains(function ($key, $value) {
            return $value <= 5;
            //true
        });
    }

где

Где метод используется для извлечения наборов в виде пар ключ-значение.

Где () методы также могут быть вызваны в цепочке.

/**
     * Use where method to find matching data
     *
     * Adding matching conditions through chain calls
     */
    public function where()
    {
        $users = User::all();
        $user = $users->where('id', 2);
        // Find users with ID 2

        $user = $users->where('id', 1)
                      ->where('age', '51')
                      ->where('name', 'Chasity Tillman');

        // Find out the user whose ID is 1 in the user set and whose age is 51 and whose name is Chasity Tillman
    }

Некоторые похожи где-как Этот метод поиска я не перечисляю по одному, вы можете посмотреть в официальных документах Laravel.

Мы можем сосредоточиться на следующем:

  • Где () – Извлекает коллекцию с парами ключ-значение в качестве параметров, где значение должно быть массивом.
  • Search () – Извлекает значение из коллекции, возвращает его индекс, если у него есть значение, и возвращает, если его нет. ложь
  • Имеет () – Посмотрите, существует ли пара ключ-значение, и верните логическое значение.

Фильтрация данных

Как вы, возможно, догадались, используйте ____________ фильтр() Метод фильтрации.

Как вы, возможно, подумали, метод фильтра примет функцию обратного вызова в качестве параметра и создаст логику суждения в функции обратного вызова, верно? Ты так думаешь?

/**
     * Find out all users younger than 35 using filter method
     */
    public function filter()
    {
        $users = User::all();
        $youngsters = $users->filter(function ($value, $key) {
            return $value->age < 35;
        });

        $youngsters->all();
        // All users younger than 35
    }

Метод фильтра получает функцию обратного вызова в качестве параметра. Параметрами функции обратного вызова являются пары ключ-значение. Логика конкретной фильтрации записана в функции, и возвращаются все допустимые значения.

Он также используется здесь. all() Метод, который возвращает все значения в коллекции.

Сортировка/сортировка данных

Коллекции позволяют нам сортировать данные двумя простыми способами:-

  • sortBy() – Сортировка данных по возрастанию
  • sortyByDesc() – Сортировка данных по убыванию

Метод сортировки принимает параметр ключа или функции обратного вызова для сортировки коллекции.

/**
     * Sorting method accepts a key or callback function parameter
     * Used to sort collections.
     */
    public function sortData()
    {
        $users  = User::all();

        $youngestToOldest = $users->sortBy('age');
        $youngestToOldest->all();
        // List all users in ascending order of age

        $movies = collect([
            [
                'name' => 'Back To The Future',
                'releases' => [1985, 1989, 1990]
            ],
            [
                'name' => 'Fast and Furious',
                'releases' => [2001, 2003, 2006, 2009, 2011, 2013, 2015, 2017]
            ],
            [
                'name' => 'Speed',
                'releases' => [1994]
            ]
        ]);

        $mostReleases = $movies->sortByDesc(function ($movie, $key) {
            return count($movie['releases']);
        });

        $mostReleases->toArray();
        // List the movies in descending order

        dd($mostReleases->values()->toArray());
        /*
           List the movies sorted in descending order and reset the key values
        */
    }

Метод сортировки сохраняет ключи для каждого значения. Хотя это может быть важно для вашего приложения, вы можете использовать метод chains values () , который сбрасывает их на приращения на основе нуля по умолчанию.

Как обычно, я также использую метод сбора для преобразования коллекций в массивы. toArray()

Группировка данных

groupBy

Группировка коллекций помогает понять ваши данные. Метод groupBy принимает ключи или обратные вызовы и возвращает набор группировок на основе возвращенных ключей или обратных вызовов.

/**
     * GroupBy returns data grouped based on keys or callback functions
     * logic
     */
    public function grouping()
    {
        $movies = collect([
            ['name' => 'Back To the Future', 'genre' => 'scifi', 'rating' => 8],
            ['name' => 'The Matrix',  'genre' => 'fantasy', 'rating' => 9],
            ['name' => 'The Croods',  'genre' => 'animation', 'rating' => 8],
            ['name' => 'Zootopia',  'genre' => 'animation', 'rating' => 4],
            ['name' => 'The Jungle Book',  'genre' => 'fantasy', 'rating' => 5],
        ]);

        $genre = $movies->groupBy('genre');
        /*
        [
             "scifi" => [
               ["name" => "Back To the Future", "genre" => "scifi", "rating" => 8,],
             ],
             "fantasy" => [
               ["name" => "The Matrix", "genre" => "fantasy", "rating" => 9,],
               ["name" => "The Jungle Book", "genre" => "fantasy", "rating" => 5, ],
             ],
             "animation" => [
               ["name" => "The Croods", "genre" => "animation", "rating" => 8,],
               ["name" => "Zootopia", "genre" => "animation", "rating" => 4, ],
             ],
        ]
        */

        $rating = $movies->groupBy(function ($movie, $key) {
            return $movie['rating'];
        });

        /*
        [
           8 => [
             ["name" => "Back To the Future", "genre" => "scifi", "rating" => 8,],
             ["name" => "The Croods", "genre" => "animation", "rating" => 8,],
           ],
           9 => [
             ["name" => "The Matrix", "genre" => "fantasy", "rating" => 9,],
           ],
           4 => [
             ["name" => "Zootopia","genre" => "animation", "rating" => 4,],
           ],
           5 => [
             ["name" => "The Jungle Book","genre" => "fantasy","rating" => 5,],
           ],
        ]
       */
    }

Получите подмножество данных

Учитывая набор данных, а затем коллекцию, вы, возможно, захотите получить ее часть. Это может быть:

  • Первые две записи
  • Последние две записи
  • Все записи, кроме двух групп.

Операции по сбору данных помогают нам выполнять эти операции небольшим количеством способов.

брать

Метод take принимает целое значение и возвращает указанное количество элементов. Учитывая отрицательное число, take() Возвращает количество указанных элементов в конце коллекции.

/**
     * The take method returns the number of n items in the set.
     * Given - n, return the last n items
     */
    public function takeMe()
    {
        $list = collect([
            'Albert', 'Ben', 'Charles', 'Dan', 'Eric', 'Xavier', 'Yuri', 'Zane'
        ]);

        // Get the first two names
        $firstTwo = $list->take(2);
        //['Albert', 'Ben']

        // Get the last two names
        $lastTwo = $list->take(-2);
        //['Yuri', 'Zane']
    }

кусок

Метод chunk делит набор на более мелкие наборы размером n.

/**
     * Chunk (n) returns smaller sets of size n, each from the original set
     * 
     */
    public function chunkMe()
    {
        $list = collect([
            'Albert', 'Ben', 'Charles', 'Dan', 'Eric', 'Xavier', 'Yuri', 'Zane'
        ]);

        $chunks = $list->chunk(3);
        $chunks->toArray();
        /*
        [
            ["Albert", "Ben", "Charles",],
            [3 => "Dan", 4 => "Eric", 5 => "Xavier",],
            [6 => "Yuri", 7 => "Zane",],
        ]
        */
    }

Существует множество способов достижения результатов.

Когда вы передаете данные на блейд-страницу, вы можете заблокировать ее, чтобы получить n строк данных одновременно, например, поместив три имени в одну строку.

@foreach($list->chunk(3) as $names)
    
@foreach($names as $name) {{ $name }} @endforeach
@endforeach

Вы также можете использовать его. collapse() Метод преобразует обновленную группу наборов в большой набор фрагмент Метод, см. Здесь.

Эргодические данные

карта

Метод map пересекает коллекцию, передавая каждый элемент в функцию замыкания, возвращаемое значение которой заменяет исходное значение элемента.

Мы создаем коллекцию имен и используем метод map для возврата коллекции соответствующих имен.

   /**
     * map function iterates a collection through a callback
     * function and performs an operation on each value.
     */
    public function mapMe()
    {
        $names = collect([
            'Albert', 'Ben', 'Charles', 'Dan', 'Eric', 'Xavier', 'Yuri', 'Zane'
        ]);

        $lengths = $names->map(function ($name, $key) {
            return strlen($name);
        });

        $lengths->toArray();
        //[6, 3, 7, 3, 4, 6, 4, 4,]
    }

преобразовать

Хотя метод карты создает новую коллекцию, иногда может потребоваться изменить исходное содержимое коллекции. Преобразование предоставляет метод обратного вызова и работает с тем же набором.

Поскольку преобразование не создает новый набор, вам не нужно присваивать ему новое значение.

/**
     * Transform operates on the original collection.
     */
    public function transformMe()
    {
        $names = collect([
            'Albert', 'Ben', 'Charles', 'Dan', 'Eric', 'Xavier', 'Yuri', 'Zane'
        ]);

        $names->transform(function ($name, $key) {
            return strlen($name);
        });

        $names->toArray();
        //[6, 3, 7, 3, 4, 6, 4, 4,]
    }

уменьшить

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

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

/**
     * Get the sum of all the numbers in a set
     */
    public function reduceMe()
    {
        $numbers = collect([
            1, 2, 3, 4, 5, 6, 7, 8, 9, 10
        ]);

        $sum = $numbers->reduce(function ($sum, $number) {
            return $sum + $number;
        });
        //55
    }

каждый

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

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

/**
     * Print a column of numbers less than or equal to five
     *
     */
    public function eachMethod()
    {
        $numbers = collect([1, 2, 3, 4, 5, 6, 7, 8, 9, 10]);
        $smallNumbers = $numbers->each(function ($num, $key) {
            if ($num > 5) {
                return false;
            }
            echo $num .", ";
        });
        //1, 2, 3, 4, 5,
    }

каждый

Каждый метод создает новую коллекцию, состоящую из каждого N-го элемента в коллекции.

теория множеств

Laravel обеспечивает поддержку теории множеств, что означает, что мы можем выполнять операции пересечения, объединения и другие операции для двух разных множеств.

союз

Метод union добавляет данный массив в коллекцию. Если данный массив содержит тот же ключ, что и исходный набор, значение исходного набора не будет изменено:

    /**
     * add array values to a collection using union
     */
    public function union()
    {
        $coolPeople = collect([
            1 => 'John', 2 => 'James', 3 => 'Jack'
        ]);

        $allCoolPeople = $coolPeople->union([
            4 => 'Sarah', 1 => 'Susan', 5 =>'Seyi'
        ]);
        $allCoolPeople->all();
        /*
        [
            1 => "John", 2 => "James", 3 => "Jack", 4 => "Sarah", 5 => "Seyi",
       ]
       */
    }

пересекаться

Метод intersect () получает массив или коллекцию в качестве параметра, который удаляет элементы коллекции, не включенные во входящий параметр.

    /**
     * Return a list of very cool people in collection that
     * are in the given array
     */
    public function intersect()
    {
        $coolPeople = collect([
            1 => 'John', 2 => 'James', 3 => 'Jack'
        ]);

        $veryCoolPeople = $coolPeople->intersect(['Sarah', 'John', 'James']);
        $veryCoolPeople->toArray();
        //[1 => "John" 2 => "James"]
    }

Можно обнаружить, что возвращаемое значение метода intersect сохраняет исходный ключ.

заключение

Я пытаюсь скрыть тот факт, что вы можете найти нужный вам метод самостоятельно, но вам еще слишком многому предстоит научиться.

Самое примечательное из всего, что я оставляю следующее

  • Общие математические методы, такие как сумма и среднее значение.
  • Используются подходы к обновлению коллекций, такие как сращивание, добавление, нажатие и всплывающее окно.

Существует еще много способов управления коллекциями документов Laravel и документов Laravel API, и вы хотите их проверить.

Чтобы ознакомиться с учебным кодом, проверьте репозиторий github здесь. Не стесняйтесь вносить свой код.

От: https://learnku.com/laravel/t…

Дополнительные статьи: https://learnku.com/laravel/c…