目次
プレビュー
コード例
不同的视角
ホームページ バックエンド開発 PHPチュートリアル Laravel Collectionsクラスを使用したコードの書き方

Laravel Collectionsクラスを使用したコードの書き方

Jul 10, 2018 pm 02:02 PM
collection laravel php tutorial チュートリアル

この記事では主に、Laravel Collections クラスを使用したコードの書き方を紹介します。これには特定の参照値があります。今、共有します。必要な友人は参照してください。

Laravel は、いくつかの素晴らしいコンポーネントを提供します。私の意見では、これは現在のすべての Web フレームワークの中で最高のコンポーネント サポートを提供するフレームワークです。すぐに使えるビュー、認証、セッション、キャッシング、Eloquent、キュー、データ検証、その他のコンポーネントを提供するだけではありません。開発ツール (Valet および Homestead) も提供されています。

しかし、このフレームワークの最も強力な機能である Collection (コレクション) クラスは、初心者には無視されがちです。この記事では、コレクションを使用してコーディング効率を向上させ、コード行を読みやすくし、より無駄のないコードを作成する方法について説明します。

プレビュー

コレクションの使用について最初に知ったのは、開発者が Eloquent を使用してデータベース クエリを実行し、foreach ステートメントを使用して返されたデータからモデル コレクションを走査したことでした。

ただし、初心者は、コレクションが基礎となるデータを操作するための 90 以上のメソッドを提供していることに気づかないかもしれません。さらに優れているのは、ほとんどすべてのメソッドが操作の連鎖をサポートしているため、コードが散文のように読めることです。これにより、あなたと他のユーザーの両方にとって、コードが読みやすくなります。

まだ本題に到達していませんか?それでは、簡単なコード スニペットを確認し、コレクションを使用して太くて高速かつ強力なコードを作成する方法を見てみましょう。

コード例

現実の世界を構築しましょう。いくつかの API インターフェイスをクエリし、配列に保存された次の結果セットを取得するとします。

<?php
// API 请求返回的结果
$data = [
    [&#39;first_name&#39; => 'John', 'last_name' => 'Doe', 'age' => 'twenties'],
    ['first_name' => 'Fred', 'last_name' => 'Ali', 'age' => 'thirties'],
    ['first_name' => 'Alex', 'last_name' => 'Cho', 'age' => 'thirties'],
];
ログイン後にコピー

配列には、名、姓、および年齢範囲が含まれていることがわかります。ここで、レコードから 30 歳 (30 代)age(age) ユーザーを取得し、姓(姓)に基づいて続行します#名前) ##ソート(並べ替え)。最後に、返される結果が 単一の文字列 であることを望み、各ユーザーが排他的な 改行を持てるようにします。最後に、返される結果が

であることを望みます。この要件を達成するのは難しくないようです。次に、PHP を使用してこの関数を実装する方法を見てみましょう。

// 依据姓氏排序
usort($data, function ($item1, $item2) {
    return $item1['last_name'] <=> $item2['last_name'];
});

// 依据年龄范围分组
$new_data = [];

foreach ($data as $key => $item) {
    $new_data[$item['age']][$key] = $item;
}

ksort($new_data, SORT_NUMERIC);

// 从年龄为 30 岁组里获取用户全名
$result = array_map(function($item) {
    return $item['first_name'].' '.$item['last_name'];
}, $new_data['thirties']);

// 将数组转换为字符串并以行分隔符分隔
$final = implode("\n", $result);

// 译注:原文是 $final = implode($results, "\n"); implode函数接收两种顺序的参数,为了保持与文档一致所以我这边做了调整。
ログイン後にコピー
実装コードは 20 行を超えています。そしてとても品がない。コメントや改行関連のコードを削除すると、このコードが読みにくくなります。さらに、一時変数と、PHP に組み込まれている不親切な並べ替えメソッドも使用する必要があります。

ここで、Collection クラスがいかに簡単かを見てみましょう:

collection($data)->where('age', 'thirties')
                 ->sortBy('last_name')
                 ->map(function($item){
                    return $item['first_name'].' '.$item['last_name'];
                 })
                 ->implode("\n");
ログイン後にコピー
すごい!コードは 20 行から 6 行になりました。コードがよりスムーズに実行されるだけでなく、どのような問題に対処しているのかをコメントで知らせる必要もなくメソッドが実装されます。

しかし、コードが完璧な段階に達することを妨げる問題がまだ 1 つあります。それは、姓と名を比較するために使用される

map メソッドです。率直に言って、これは大したことではありませんが、マクロの概念を探求する動機となります。

コレクションの拡張

Collection クラスは、他の Laravel コンポーネントと同様にマクロをサポートしています。つまり、メソッドを追加して後で使用することができます。

ヒント: 新しいメソッドをどこでも利用できるようにするには、そのメソッドをサービス プロバイダーに追加する必要があります。この関数を実装するための MacroServiceProvider を任意に作成したいと思います。
配列によって提供される任意の数のフィールドを連結し、文字列の結果を返すメソッドを追加しましょう:

Collection::macro('toConcatenatedString', function ($fields = [], $separator = ' ') {
    return $this->map(function($item) use ($fields, $separator) {
        return implode($separator, array_map(function ($el) use ($item) {
                return $item[$el];
            }, $fields)
        );
    })->implode("\n");
});
ログイン後にコピー
このメソッドを追加すると、コードは基本的に完璧になります:

collect($data)->where('age', 'thirties')
              ->sortBy('last_name')
              ->toConcatenatedString(['first_name', 'last_name']);
ログイン後にコピー
コードは 20 行以上あった混沌とした 3 行に整理され、すっきりと整理され、誰でもすぐに理解できる明確な機能を備えています。

別の例

次に 2 番目の例を見てみましょう。ユーザーのリストがあると仮定して、ロールに基づいてユーザーをフィルターし、登録期間が 5 年の場合はさらにフィルターする必要があります。またはそれより古い、

が A ~ M の文字で始まる場合、最初のユーザーのみが取得されます。

データは次のようになります:

<?php
// API 请求返回的结果
$users = [
    [&#39;name&#39; => 'John Doe', 'role' => 'vip', 'years' => 7],
    ['name' => 'Fred Ali', 'role' => 'vip', 'years' => 3],
    ['name' => 'Alex Cho', 'role' => 'user', 'years' => 9],
];
ログイン後にコピー
PHP 実装を使用している場合、コードは次のようになります:

$subset = [];
foreach ($users as $user) {
    if ($user['role'] === 'vip' && $user['years'] >= 5) {
        if (preg_match('/\s[A-Z]/', $user['name'])) {
            $subset[] = $user;
        }
    }
}
return reset($subset)
ログイン後にコピー
注: 2 番目の if ステートメントは最初のステートメント内に移動されますが、条件が 2 つを超えるとコードが読みにくくなると思うので、個人的には 1 つの if ステートメント内で使用する条件は 2 つまでにしたいと考えています。
このコードはそれほど悪くありませんが、それでも一時変数を使用する必要があり、

reset 関数を使用してポインターを最初のユーザーにリセットする必要もあります。私たちのコードには 4 レベルのインデントもあり、コードの解析がさらに難しくなります。

代わりに、コレクションがこの問題をどのように処理するかを見てみましょう:

collect($users)->where('role', 'vip')
              ->map(function($user) {
                  return preg_match('/\s[A-Z]/', $user['name']);
              })
              ->firstWhere('years', '>=', '5');
ログイン後にコピー

我们将代码简化到了之前的一般左右,每一步过滤处理清晰明了,并且我们不需要引入临时变量。

遗憾的是目前集合还不支持正则匹配,所以我们使用 map 方法,不过我们可以为这个功能创建一个宏:

Collection::macro('whereRegex', function($expression, $field) {
    return $this->map(function ($item) use ($expression, $field) {
        return preg_match($expression, $item[$field]);
    })
});
ログイン後にコピー

得益于宏方法,我们的代码现在看起来如下:

collect($users) -> where('role', 'vip')
                -> whereRegex('/\s[A-Z]/', 'name')
                -> firstWhere('years', '>=', 5);
ログイン後にコピー
注意:  为了简单起见,我们的红仅仅适用于数组集合。如果你计划让它们可以在 Eloquent 集合上使用,你需要在此场景下做相应的代码处理才行。

不同的视角

我们可以继续列出无数的示例,但仍然无法涵盖所有可用的集合方法,并且这从来都不是本文的真正目的。

需要注意的是,通过使用 Collection 类,您不仅可以获得一个方法库来简化编程工作,还可以选择一种从根本上改善代码的方法。

你会情不自禁的将你的代码结构从代码块重构简化成一行,同时减少代码的缩进,临时变量的使用和技巧性方法,另外你还可以使用链式编程方法,这让你的代码更加便于阅读和解析,此外最重要的是减少了编码工作!

查看官方文档获取更多这个迷人的类库的使用细节:https://laravel.com/docs/coll...

提示: 你还可以获取这个 Collection 类独立安装包,在使用非 laravel 项目是会非常有帮助。感谢 Tighten Co 团队做出的努力 https://github.com/tightenco/...。

感谢阅读,快乐编码!

以上就是本文的全部内容,希望对大家的学习有所帮助,更多相关内容请关注PHP中文网!

相关推荐:

关于Laravel的Eloquent ORM的解析

以上がLaravel Collectionsクラスを使用したコードの書き方の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

バングラ部分モデル検索のlaravelEloquent orm) バングラ部分モデル検索のlaravelEloquent orm) Apr 08, 2025 pm 02:06 PM

LaravelEloquentモデルの検索:データベースデータを簡単に取得するEloquentormは、データベースを操作するための簡潔で理解しやすい方法を提供します。この記事では、さまざまな雄弁なモデル検索手法を詳細に紹介して、データベースからのデータを効率的に取得するのに役立ちます。 1.すべてのレコードを取得します。 ALL()メソッドを使用して、データベーステーブルですべてのレコードを取得します:useapp \ models \ post; $ post = post :: all();これにより、コレクションが返されます。 Foreach Loopまたはその他の収集方法を使用してデータにアクセスできます。

PHPの未来:適応と革新 PHPの未来:適応と革新 Apr 11, 2025 am 12:01 AM

PHPの将来は、新しいテクノロジーの傾向に適応し、革新的な機能を導入することで達成されます。1)クラウドコンピューティング、コンテナ化、マイクロサービスアーキテクチャに適応し、DockerとKubernetesをサポートします。 2)パフォーマンスとデータ処理の効率を改善するために、JITコンパイラと列挙タイプを導入します。 3)パフォーマンスを継続的に最適化し、ベストプラクティスを促進します。

Laravelの地理空間:インタラクティブマップと大量のデータの最適化 Laravelの地理空間:インタラクティブマップと大量のデータの最適化 Apr 08, 2025 pm 12:24 PM

700万のレコードを効率的に処理し、地理空間技術を使用したインタラクティブマップを作成します。この記事では、LaravelとMySQLを使用して700万を超えるレコードを効率的に処理し、それらをインタラクティブなマップの視覚化に変換する方法について説明します。最初の課題プロジェクトの要件:MySQLデータベースに700万のレコードを使用して貴重な洞察を抽出します。多くの人は最初に言語をプログラミングすることを検討しますが、データベース自体を無視します。ニーズを満たすことができますか?データ移行または構造調​​整は必要ですか? MySQLはこのような大きなデータ負荷に耐えることができますか?予備分析:キーフィルターとプロパティを特定する必要があります。分析後、ソリューションに関連している属性はわずかであることがわかりました。フィルターの実現可能性を確認し、検索を最適化するためにいくつかの制限を設定しました。都市に基づくマップ検索

PHP対Python:違いを理解します PHP対Python:違いを理解します Apr 11, 2025 am 12:15 AM

PHP and Python each have their own advantages, and the choice should be based on project requirements. 1.PHPは、シンプルな構文と高い実行効率を備えたWeb開発に適しています。 2。Pythonは、簡潔な構文とリッチライブラリを備えたデータサイエンスと機械学習に適しています。

PHPとPython:2つの一般的なプログラミング言語を比較します PHPとPython:2つの一般的なプログラミング言語を比較します Apr 14, 2025 am 12:13 AM

PHPとPythonにはそれぞれ独自の利点があり、プロジェクトの要件に従って選択します。 1.PHPは、特にWebサイトの迅速な開発とメンテナンスに適しています。 2。Pythonは、データサイエンス、機械学習、人工知能に適しており、簡潔な構文を備えており、初心者に適しています。

PHPの現在のステータス:Web開発動向を見てください PHPの現在のステータス:Web開発動向を見てください Apr 13, 2025 am 12:20 AM

PHPは、現代のWeb開発、特にコンテンツ管理とeコマースプラットフォームで依然として重要です。 1)PHPには、LaravelやSymfonyなどの豊富なエコシステムと強力なフレームワークサポートがあります。 2)パフォーマンスの最適化は、Opcacheとnginxを通じて達成できます。 3)PHP8.0は、パフォーマンスを改善するためにJITコンパイラを導入します。 4)クラウドネイティブアプリケーションは、DockerおよびKubernetesを介して展開され、柔軟性とスケーラビリティを向上させます。

LaravelとThe BackEnd:Webアプリケーションロジックの電源 LaravelとThe BackEnd:Webアプリケーションロジックの電源 Apr 11, 2025 am 11:29 AM

Laravelはバックエンドロジックでどのように役割を果たしますか?ルーティングシステム、Eloquentorm、認証と承認、イベントとリスナー、パフォーマンスの最適化を通じてバックエンド開発を簡素化および強化します。 1.ルーティングシステムにより、URL構造の定義とリクエスト処理ロジックが可能になります。 2.Eloquentormは、データベースの相互作用を簡素化します。 3.認証および承認システムは、ユーザー管理に便利です。 4.イベントとリスナーは、ゆるく結合したコード構造を実装します。 5.パフォーマンスの最適化により、キャッシュとキューイングを通じてアプリケーションの効率が向上します。

PHP:多くのウェブサイトの基礎 PHP:多くのウェブサイトの基礎 Apr 13, 2025 am 12:07 AM

PHPが多くのWebサイトよりも優先テクノロジースタックである理由には、その使いやすさ、強力なコミュニティサポート、広範な使用が含まれます。 1)初心者に適した学習と使用が簡単です。 2)巨大な開発者コミュニティと豊富なリソースを持っています。 3)WordPress、Drupal、その他のプラットフォームで広く使用されています。 4)Webサーバーとしっかりと統合して、開発の展開を簡素化します。

See all articles