31、Laravel Collections and Related Concepts: A Comprehensive Guide

Laravel Collections and Related Concepts: A Comprehensive Guide

1. Introduction to Laravel Collections

Laravel collections are like supercharged arrays, offering a wide range of powerful operations that PHP’s native arrays lack. They bring the concept of collection pipelines to PHP, making it easier to manipulate and process data.

Let’s start with a simple example of calculating the total points of users in the green team:

$users = [...];
$greenTeamPoints = collect($users)->filter(function ($user) {
    return $user->team == 'green';
})->sum('points');

In this code, we first create a collection from the $users array. Then, we use the filter method to select only the users in the green team. Finally, we calculate the sum of their points using the sum method.

2. Core Collection Methods
2.1 all() and toArray()

These methods are used to convert a collection to an array. However, they have different behaviors when dealing with Eloquent objects.
- toArray() : Flattens not only the collection but also any Eloquent objects within it to arrays.
- all() : Only converts the collection to an array, preserving Eloquent objects as they are.

Here are some examples:

$users = User::all();
$users->toArray();
/* Returns
    [
        ['id' => '1', 'name' => 'Agouhanna'],
        ...
    ]
*/
$users->all();
/* Returns
    [
        Eloquent Object { id : 1, name: 'Agouhanna' },
        ...
    ]
*/
2.2 filter() and reject()

These methods are used to get a subset of the original collection based on a condition defined by a closure.
- filter() : Keeps an item if the closure returns true .
- reject() : Keeps an item if the closure returns false .

$users = collect([...]);
$admins = $users->filter(function ($user) {
    return $user->isAdmin;
});
$paidUsers = $users->reject(function ($user) {
    return $user->isTrial;
});
2.3 where()

The where() method is a shortcut for getting a subset of the collection where a given key is equal to a given value. It can also be achieved using filter() , but where() is more concise for common scenarios.

$users = collect([...]);
$admins = $users->where('role', 'admin');
2.4 first() and last()

These methods are used to get a single item from the collection.
- Without parameters, they return the first or last item in the collection.
- With a closure, they return the first or last item that satisfies the closure.

$users = collect([...]);
$owner = $users->first(function ($user) {
    return $user->isOwner;
});
$firstUser = $users->first();
$lastUser = $users->last();

You can also pass a second parameter as a default value in case the closure doesn’t return any results.

2.5 each()

The each() method is used to perform an action on each item in the collection without modifying the items or the collection itself.

$users = collect([...]);
$users->each(function ($user) {
    dispatch(new EmailUserAThing($user));
});
2.6 map()

The map() method is used to iterate over all items in the collection, make changes to them, and return a new collection with the modified items.

$users = collect([...]);
$users = $users->map(function ($user) {
    return [
        'name' => $user['first'] . ' ' . $user['last'],
        'email' => $user['email']
    ];
});
2.7 reduce()

The reduce() method is used to get a single result from the collection, such as a count or a string. You can define an initial value for the “carry” and a closure that updates the carry based on each item in the collection.

$users = collect([...]);
$points = $users->reduce(function ($carry, $user) {
    return $carry + $user['points'];
}, 0); // Start with a carry of 0
2.8 pluck()

The pluck() method is used to extract the values of a given key from each item in the collection.

$users = collect([...]);
$emails = $users->pluck('email')->toArray();
2.9 chunk() and take()
  • chunk() : Splits the collection into groups of a predefined size.
  • take() : Pulls a specified number of items from the collection.
$users = collect([...]);
$rowsOfUsers = $users->chunk(3); // Separates into groups of 3
$topThree = $users->take(3); // Pulls the first 3
2.10 groupBy()

The groupBy() method is used to group all items in the collection by the value of one of their properties. You can also pass a closure to define custom grouping criteria.

$users = collect([...]);
$usersByRole = $users->groupBy('role');
/* Returns:
    [
        'member' => [...],
        'admin' => [...]
    ]
*/

$heroes = collect([...]);
$heroesByAbilityType = $heroes->groupBy(function ($hero) {
    if ($hero->canFly() && $hero->isInvulnerable()) {
        return 'Kryptonian';
    }
    if ($hero->bitByARadioactiveSpider()) {
        return 'Spidermanesque';
    }
    if ($hero->color === 'green' && $hero->likesSmashing()) {
        return 'Hulk-like';
    }
    return 'Generic';
});
2.11 reverse() and shuffle()
  • reverse() : Reverses the order of the items in the collection.
  • shuffle() : Randomizes the order of the items in the collection.
$numbers = collect([1, 2, 3]);
$numbers->reverse()->toArray(); // [3, 2, 1]
$numbers->shuffle()->toArray(); // [2, 3, 1]
2.12 sort(), sortBy(), and sortByDesc()
  • sort() : Sorts simple strings or integers.
  • sortBy() and sortByDesc() : Can be used to sort more complex items by passing a string representing a property or a closure.
$sortedNumbers = collect([1, 7, 6, 4])->sort()->toArray(); // [1, 4, 6, 7]

$users = collect([...]);
// Sort an array of users by their 'email' property
$users->sort('email');
// Sort an array of users by their 'email' property
$users->sort(function ($user, $key) {
    return $user['email'];
});
2.13 count() and isEmpty()
  • count() : Returns the number of items in the collection.
  • isEmpty() : Checks if the collection is empty.
$numbers = collect([1, 2, 3]);
$numbers->count();   // 3
$numbers->isEmpty(); // false
2.14 avg() and sum()
  • When working with a collection of numbers, these methods calculate the average and sum respectively without requiring any parameters.
  • When working with arrays, you can pass the key of the property to operate on.
collect([1, 2, 3])->sum(); // 6
collect([1, 2, 3])->avg(); // 2

$users = collect([...]);
$sumPoints = $users->sum('points');
$avgPoints = $users->avg('points');
3. Using Collections Outside of Laravel

If you want to use Laravel collections in non - Laravel projects, you can use the Collect project. Just run the following command:

composer require tightenco/collect

After that, you can use the Illuminate\Support\Collection class and the collect() helper in your code.

4. Glossary of Related Concepts
Term Definition
Accessor A method on an Eloquent model that customizes how a property is returned.
ActiveRecord A database ORM pattern used by Laravel’s Eloquent, where the model class handles record retrieval, persistence, and representation.
Application test Tests the entire behavior of an application, often using a DOM crawler.
Argument (Artisan) Parameters passed to Artisan console commands without prefixes or equal signs.
Artisan A tool for interacting with Laravel applications from the command line.
Assertion The core of a test, used to check if a condition is met.
Authentication The process of correctly identifying oneself as a member/user of an application.
Authorization Defines what a user is allowed to do based on their identification.
Autowiring A feature of dependency injection containers that can inject instances without explicit configuration.
beanstalkd A work queue daemon, often used as a driver for Laravel queues.
Blade Laravel’s templating engine.
Carbon A PHP package for easier date handling.
Cashier A Laravel package for handling billing with Stripe or Braintree.
Closure PHP’s version of anonymous functions.
CodeIgniter An older PHP framework that inspired Laravel.
Collection A development pattern and Laravel tool for data manipulation.
Command A custom Artisan console task.
Composer PHP’s dependency manager.
Container The application container in Laravel responsible for dependency injection.
Contract Another name for an interface.
Controller A class that routes user requests and returns responses.
CSRF A malicious attack where an external site hijacks users’ browsers to make requests.
Dependency injection A design pattern where dependencies are injected into a class from the outside.
Directive Blade syntax options like @if , @unless .
Dot notation A way to navigate nested arrays using . to represent levels.
Eager loading A technique to avoid N + 1 problems by making additional queries.
Echo A Laravel product for WebSocket authentication and data syncing.
Elixir Laravel’s build tool, a wrapper around Gulp.
Eloquent Laravel’s ActiveRecord ORM.
Environment variable Variables defined in an .env file, excluded from version control.
Envoyer A Laravel product for zero - downtime deployment.
Event A tool for implementing pub/sub or observer patterns in Laravel.
Facade A tool in Laravel for simplifying access to complex services.
Flag A boolean parameter.
Fluent Methods that can be chained together.
Flysystem A package for local and cloud file access in Laravel.
Forge A Laravel product for managing virtual servers on cloud providers.
FQCN The fully - qualified class name of a class, trait, or interface.
Gulp A JavaScript - based build tool.
Helper A globally accessible PHP function that simplifies other functionality.
Homestead A Laravel tool for local development using Vagrant.
Illuminate The top - level namespace of Laravel components.
Integration test Tests how individual units work together.
IoC The concept of giving control of object instantiation to higher - level code.
Job A class that encapsulates a single task and can be queued.
JSON A syntax for data representation.
JWT A JSON object for authentication and access control.
Mass assignment The ability to pass multiple parameters to create or update an Eloquent model.
Middleware Wrappers around an application to filter and decorate inputs and outputs.
Memcached An in - memory data store.
Migration A database manipulation stored in code.
Mockery A library for mocking PHP classes in tests.
Model factory A tool for generating model instances for testing or seeding.
Multitenancy A single app serving multiple clients with their own themes and domains.
Mutator A tool in Eloquent for manipulating data before saving to the database.
Nginx A web server similar to Apache.
Option (Artisan) Parameters passed to Artisan commands, prefixed with -- .
ORM A design pattern for representing database data as objects.
Passport A Laravel package for adding an OAuth authentication server.
PHPSpec A PHP testing framework.
PHPUnit A widely used PHP testing framework.
Polymorphic The ability to interact with multiple database tables with similar characteristics.
Preprocessor A build tool that converts a special form of a language to a normal one.
Primary key A column in a database table that uniquely identifies each row.
Queue A stack for adding jobs to be processed asynchronously.
Redis A fast data store with limited data types.
REST A common API format with stateless requests.
Route A definition of how a user can visit a web application.
SaaS Software as a Service, web - based applications for a fee.
Scope A tool in Eloquent for narrowing down queries.
Scout A Laravel package for full - text search on Eloquent models.
Serialization The process of converting complex data to simpler forms.
Service provider A structure in Laravel for registering and booting classes and bindings.
Soft delete Marking a database row as “deleted” without actually deleting it.
Spark A Laravel tool for creating subscription - based SaaS apps.
Symfony A PHP framework that provides excellent components.
Tinker Laravel’s REPL for performing PHP operations from the command line.
Typehint A way to specify the type of a parameter in a method signature.
Unit test Tests small, isolated units like a class or method.
Vagrant A command - line tool for building virtual machines.
Valet A Laravel package for serving applications on local development folders.
Validation Ensuring user input matches expected patterns.
View composer A tool that provides data to a view every time it is loaded.
View A template file for generating HTML responses.

This guide has covered the core concepts of Laravel collections and related terms. Understanding these concepts will help you write more efficient and maintainable Laravel applications.

The following mermaid flowchart shows the basic process of using a collection method:

graph TD;
    A[Start] --> B[Create a collection];
    B --> C{Select a method};
    C -->|all()/toArray()| D[Convert to array];
    C -->|filter()/reject()| E[Filter items];
    C -->|where()| F[Get subset by key - value];
    C -->|first()/last()| G[Get single item];
    C -->|each()| H[Perform action on each item];
    C -->|map()| I[Modify items and return new collection];
    C -->|reduce()| J[Get single result];
    C -->|pluck()| K[Extract values of a key];
    C -->|chunk()/take()| L[Split or take items];
    C -->|groupBy()| M[Group items];
    C -->|reverse()/shuffle()| N[Reverse or randomize order];
    C -->|sort()/sortBy()/sortByDesc()| O[Sort items];
    C -->|count()/isEmpty()| P[Check item count or emptiness];
    C -->|avg()/sum()| Q[Calculate average or sum];
    D --> R[End];
    E --> R;
    F --> R;
    G --> R;
    H --> R;
    I --> R;
    J --> R;
    K --> R;
    L --> R;
    M --> R;
    N --> R;
    O --> R;
    P --> R;
    Q --> R;

This flowchart shows the different paths you can take when working with Laravel collections, depending on the method you choose. Each method serves a specific purpose, and by combining them, you can perform complex data manipulations with ease.

Laravel Collections and Related Concepts: A Comprehensive Guide

5. Practical Use Cases of Laravel Collections
5.1 Data Aggregation

Suppose you have a collection of sales records and you want to calculate the total sales amount and the average sale per transaction. You can use the sum() and avg() methods as follows:

$sales = collect([
    ['amount' => 100],
    ['amount' => 200],
    ['amount' => 300]
]);

$totalSales = $sales->sum('amount');
$averageSale = $sales->avg('amount');

echo "Total Sales: $totalSales<br>";
echo "Average Sale: $averageSale";
5.2 Filtering and Sorting User Data

In a user management system, you may need to filter out active users and sort them by their registration date.

$users = collect([
    ['id' => 1, 'name' => 'John', 'isActive' => true, 'registeredAt' => '2023-01-01'],
    ['id' => 2, 'name' => 'Jane', 'isActive' => false, 'registeredAt' => '2023-02-01'],
    ['id' => 3, 'name' => 'Doe', 'isActive' => true, 'registeredAt' => '2023-03-01']
]);

$activeUsers = $users->filter(function ($user) {
    return $user['isActive'];
});

$sortedActiveUsers = $activeUsers->sortBy('registeredAt');

foreach ($sortedActiveUsers as $user) {
    echo $user['name'] . '<br>';
}
5.3 Grouping Data for Reporting

If you have a collection of orders grouped by their status (e.g., pending, completed, cancelled), you can use the groupBy() method to generate a report.

$orders = collect([
    ['id' => 1, 'status' => 'pending'],
    ['id' => 2, 'status' => 'completed'],
    ['id' => 3, 'status' => 'pending'],
    ['id' => 4, 'status' => 'cancelled']
]);

$ordersByStatus = $orders->groupBy('status');

foreach ($ordersByStatus as $status => $orderGroup) {
    echo "Status: $status, Count: " . $orderGroup->count() . '<br>';
}
6. Advanced Collection Operations
6.1 Chaining Multiple Methods

One of the powerful features of Laravel collections is the ability to chain multiple methods together. For example, you can filter, sort, and then pluck data in a single line of code.

$users = collect([
    ['id' => 1, 'name' => 'John', 'age' => 25, 'isAdmin' => false],
    ['id' => 2, 'name' => 'Jane', 'age' => 30, 'isAdmin' => true],
    ['id' => 3, 'name' => 'Doe', 'age' => 35, 'isAdmin' => false]
]);

$adminNames = $users->filter(function ($user) {
    return $user['isAdmin'];
})->sortBy('age')->pluck('name')->toArray();

print_r($adminNames);
6.2 Using Custom Closures

You can create custom closures to perform complex operations on collections. For instance, you can calculate the total points of users in different teams and then find the team with the highest points.

$users = collect([
    ['name' => 'User1', 'team' => 'red', 'points' => 10],
    ['name' => 'User2', 'team' => 'blue', 'points' => 20],
    ['name' => 'User3', 'team' => 'red', 'points' => 15],
    ['name' => 'User4', 'team' => 'blue', 'points' => 25]
]);

$teamPoints = $users->groupBy('team')->map(function ($teamUsers) {
    return $teamUsers->sum('points');
});

$topTeam = $teamPoints->sortDesc()->keys()->first();

echo "Top team: $topTeam";
7. Best Practices for Using Laravel Collections
7.1 Keep Code Readable

When using multiple methods in a chain, break the code into multiple lines for better readability. For example:

$users = collect([...]);

$filteredAndSortedUsers = $users
    ->filter(function ($user) {
        return $user['isActive'];
    })
    ->sortBy('name')
    ->take(5);
7.2 Avoid Unnecessary Operations

Don’t perform operations on a collection if they are not needed. For example, if you only need the first item that meets a certain condition, use first() instead of filtering the entire collection and then getting the first item.

$users = collect([...]);

// Good
$firstActiveUser = $users->first(function ($user) {
    return $user['isActive'];
});

// Bad
$activeUsers = $users->filter(function ($user) {
    return $user['isActive'];
});
$firstActiveUser = $activeUsers->first();
7.3 Use Type Hints

When passing closures to collection methods, use type hints to make the code more self - explanatory and to catch potential errors early.

$users = collect([...]);

$adminUsers = $users->filter(function (array $user): bool {
    return $user['isAdmin'];
});
8. Comparison with Other Data Manipulation Techniques
Technique Advantages Disadvantages
Laravel Collections Easy to use, powerful methods, chainable, works well with Eloquent models May have a slight performance overhead compared to native PHP arrays for simple operations
Native PHP Arrays Fast for simple operations, no additional dependencies Lack of built - in methods for complex data manipulation, more code needed for filtering, sorting, etc.
Database Queries Can directly interact with the database, useful for large datasets Limited in - memory manipulation capabilities, may require multiple queries for complex operations

The following mermaid flowchart shows the decision - making process when choosing a data manipulation technique:

graph TD;
    A[Start] --> B{Data size and complexity};
    B -->|Small and simple| C[Use native PHP arrays];
    B -->|Large or complex| D{Need database interaction?};
    D -->|Yes| E[Use database queries];
    D -->|No| F[Use Laravel collections];
    C --> G[End];
    E --> G;
    F --> G;

This flowchart helps you decide whether to use native PHP arrays, database queries, or Laravel collections based on the size and complexity of your data and whether you need to interact with the database.

In conclusion, Laravel collections are a powerful tool for data manipulation in Laravel applications. By understanding the core methods, advanced operations, and best practices, you can write more efficient and maintainable code. The related concepts in Laravel, such as Eloquent, Artisan, and middleware, also play important roles in building robust applications. Mastering these concepts and techniques will enhance your Laravel development skills and allow you to create high - quality applications.

内容概要:本文设计了一种基于PLC的全自动洗衣机控制系统内容概要:本文设计了一种,采用三菱FX基于PLC的全自动洗衣机控制系统,采用3U-32MT型PLC作为三菱FX3U核心控制器,替代传统继-32MT电器控制方式,提升了型PLC作为系统的稳定性与自动化核心控制器,替代水平。系统具备传统继电器控制方式高/低水,实现洗衣机工作位选择、柔和过程的自动化控制/标准洗衣模式切换。系统具备高、暂停加衣、低水位选择、手动脱水及和柔和、标准两种蜂鸣提示等功能洗衣模式,支持,通过GX Works2软件编写梯形图程序,实现进洗衣过程中暂停添加水、洗涤、排水衣物,并增加了手动脱水功能和、脱水等工序蜂鸣器提示的自动循环控制功能,提升了使用的,并引入MCGS组便捷性与灵活性态软件实现人机交互界面监控。控制系统通过GX。硬件设计包括 Works2软件进行主电路、PLC接梯形图编程线与关键元,完成了启动、进水器件选型,软件、正反转洗涤部分完成I/O分配、排水、脱、逻辑流程规划水等工序的逻辑及各功能模块梯设计,并实现了大形图编程。循环与小循环的嵌; 适合人群:自动化套控制流程。此外、电气工程及相关,还利用MCGS组态软件构建专业本科学生,具备PL了人机交互C基础知识和梯界面,实现对洗衣机形图编程能力的运行状态的监控与操作。整体设计涵盖了初级工程技术人员。硬件选型、; 使用场景及目标:I/O分配、电路接线、程序逻辑设计及组①掌握PLC在态监控等多个方面家电自动化控制中的应用方法;②学习,体现了PLC在工业自动化控制中的高效全自动洗衣机控制系统的性与可靠性。;软硬件设计流程 适合人群:电气;③实践工程、自动化及相关MCGS组态软件与PLC的专业的本科生、初级通信与联调工程技术人员以及从事;④完成PLC控制系统开发毕业设计或工业的学习者;具备控制类项目开发参考一定PLC基础知识。; 阅读和梯形图建议:建议结合三菱编程能力的人员GX Works2仿真更为适宜。; 使用场景及目标:①应用于环境与MCGS组态平台进行程序高校毕业设计或调试与运行验证课程项目,帮助学生掌握PLC控制系统的设计,重点关注I/O分配逻辑、梯形图与实现方法;②为工业自动化领域互锁机制及循环控制结构的设计中类似家电控制系统的开发提供参考方案;③思路,深入理解PL通过实际案例理解C在实际工程项目PLC在电机中的应用全过程。控制、时间循环、互锁保护、手动干预等方面的应用逻辑。; 阅读建议:建议结合三菱GX Works2编程软件和MCGS组态软件同步实践,重点理解梯形图程序中各环节的时序逻辑与互锁机制,关注I/O分配与硬件接线的对应关系,并尝试在仿真环境中调试程序以加深对全自动洗衣机控制流程的理解。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值