亚洲国产日韩欧美一区二区三区,精品亚洲国产成人av在线,国产99视频精品免视看7,99国产精品久久久久久久成人热,欧美日韩亚洲国产综合乱

目次
1. 多対多の関係モデルの設(shè)定を理解する
2. N 1 問題を回避するために関連データをプリロードする
3. 特定の列データを抽出してフォーマットする
4. Laravel API リソースを使用して出力を最適化する
5. 予防措置とベストプラクティス
要約する
ホームページ バックエンド開発 PHPチュートリアル Laravel Eloquent: 多対多の関係で特定の列の配列形式のデータを効率的に取得する

Laravel Eloquent: 多対多の関係で特定の列の配列形式のデータを効率的に取得する

Oct 16, 2025 pm 06:45 PM

Laravel Eloquent: 多対多の関係で特定の列の配列形式のデータを効率的に取得する

このチュートリアルでは、Laravel Eloquent のプリロード (with) 関數(shù)とデータ変換 (pluck、map) 関數(shù)を使用して、多対多の関係から関連モデルの特定の列データを抽出し、それを簡潔な配列形式に統(tǒng)合する方法について詳しく説明します。この記事では、具體的なコード例を通じて、開発者が関連データの読み込みと書式設(shè)定を最適化しながらメイン テーブル データをバッチ クエリする方法をガイドし、最終的に API 要件を満たすカスタマイズされたデータ出力を?qū)g現(xiàn)して、データ処理の効率と柔軟性を向上させます。

Laravel アプリケーション開発では、多対多の関係を処理することが一般的な要件です。たとえば、「人」は複數(shù)の「スキル」を持つことができ、「スキル」を複數(shù)の人が所有することもできます。全員に関する情報(bào)をクエリする必要があり、全員のスキルを名前の単純な配列として表現(xiàn)したい場(chǎng)合は、特定の Eloquent クエリとデータ処理テクニックを使用する必要があります。

1. 多対多の関係モデルの設(shè)定を理解する

まず、Eloquent モデルが多対多の関係向けに適切に設(shè)定されていることを確認(rèn)します。 Person と Skill という 2 つのモデルと、中間テーブル (person_skill など) があるとします。

データベーステーブル構(gòu)造の例:

  • person_table: ID、name_of_person
  • スキルテーブル: ID、スキル名
  • person_skill (中間テーブル): person_id、skill_id

雄弁なモデル定義の例:

パーソン モデルのスキル モデルとの多対多の関係を定義します。

 // アプリ/モデル/パーソン.php
名前空間 App\Models;

Illuminate\Database\Eloquent\Model を使用します。
Illuminate\Database\Eloquent\Relations\BelongsToMany を使用します。

クラス パーソン がモデルを拡張する
{
    protected $table = 'person_table'; // テーブル名が正しいことを確認(rèn)してください public function skill(): BelongsToMany
    {
        return $this->belongsToMany(Skill::class, 'person_skill', 'person_id', 'skill_id');
    }
}

Skill モデルの Person モデルとの多対多の関係を定義します (オプションですが推奨)。

 // アプリ/モデル/スキル.php
名前空間 App\Models;

Illuminate\Database\Eloquent\Model を使用します。
Illuminate\Database\Eloquent\Relations\BelongsToMany を使用します。

クラススキルはモデルを拡張します
{
    protected $table = 'スキルテーブル'; // テーブル名が正しいことを確認(rèn)してください public function person(): BelongsToMany
    {
        return $this->belongsToMany(person::class, 'person_skill', 'skill_id', 'person_id');
    }
}

2. N 1 問題を回避するために関連データをプリロードする

メイン テーブル データをクエリするときに、関連データがループを通じて直接アクセスされると、悪名高い N 1 クエリの問題が発生し、パフォーマンスに重大な影響を及ぼします。この狀況を回避するには、関連するデータのプリロード (Eager Loading) に Eloquent の with() メソッドを使用する必要があります。

 App\Models\Personal を使用します。

// すべての Person とそれに関連付けられたスキル データを取得します $persons = Person::with('skills')->get();

// この時(shí)點(diǎn)で、$persons は PERSON モデルのコレクションであり、各 PERSON モデルにはそのスキル関係がロードされています。
// たとえば、$persons->first()->skills にアクセスすると、スキル モデルを含むコレクションになります。

3. 特定の列データを抽出してフォーマットする

Person::with('skills')->get() によって返されるスキル関係は、完全なスキル モデル オブジェクト (id、name_of_skill などのすべてのフィールドを含む) を含むコレクションです。そして、私たちの目標(biāo)は、name_of_skill フィールドのみを取得し、それを文字列配列に編成することです。

Laravel Collection は、コレクションから指定されたキーの値を簡単に抽出するための pluck() メソッドを提供します。 map() メソッドと組み合わせると、 person コレクションを走査し、各 person オブジェクトのスキル関係を変換できます。

 App\Models\Personal を使用します。

$persons = 人::with('スキル')->get();

$formattedPersons = $persons->map(function (person $person) {
    戻る [
        'id' => $person->id,
        '名前' => $person->name_of_person、
        'skills' => $person->skills->pluck('name_of_skill')->toArray(), // pluck を使用してスキル名を抽出し、配列に変換します。
});

// $formattedPersons は、必要な形式のデータを含むコレクションになりました。 /* 出力例 ($formattedPersons->toArray() で表示):
[
    {
        「id」: 1、
        "名前": "ハラット",
        「スキル」: [
            "php"、
            「ララベル」、
            "反応js"、
            「ノード」
        】
    }、
    // ...詳細(xì)人物データ]
*/

上記のコードでは次のようになります。

  • $persons->map(...) は、人物モデルのコレクションを反復(fù)処理します。
  • 人物モデルごとに、新しい連想配列を構(gòu)築します。
  • $person->skills は、プリロードされたスキル セットにアクセスします。
  • $person->skills->pluck('name_of_skill') は、スキル コレクションからすべての name_of_skill フィールドの値を抽出し、新しいコレクションを返します。
  • .toArray() は、このコレクションを、期待される出力形式に準(zhǔn)拠した純粋な PHP 配列に変換します。

4. Laravel API リソースを使用して出力を最適化する

より複雑な API 応答や、統(tǒng)一されたデータ出力形式を必要とするシナリオの場(chǎng)合、Laravel の API リソースはよりエレガントで強(qiáng)力なソリューションです。これにより、モデルの変換ロジックをカプセル化して、明確で再利用可能なデータ レイヤーを提供できます。

リソースの作成:

 php 職人 make:resource PersonResource
php 職人 make:resource SkillResource

SkillResource を定義します (必要に応じて、ここでは PersonResource で直接処理します)。

 // アプリ/Http/Resources/SkillResource.php
// 名前だけが必要な場(chǎng)合は、SkillResource であまり多くの処理を行わないか、または PersonResource で直接取得することを検討してください。
// ただし、SkillResource は、スキルに表示する必要がある他のフィールドがある場(chǎng)合に役立ちます。
/*
Illuminate\Http\Resources\Json\JsonResource を使用します。

クラス SkillResource は JsonResource を拡張します
{
    パブリック関數(shù) toArray($request)
    {
        戻る [
            'id' => $this->id,
            'name' => $this->name_of_skill,
            // ...その他のスキル関連フィールド];
    }
}
*/

パーソンリソースを定義します。

 // アプリ/Http/Resources/PersonResource.php
名前空間 App\Http\Resources;

Illuminate\Http\Resources\Json\JsonResource を使用します。

クラス PersonResource は JsonResource を拡張します
{
    /**
     * リソースを配列に変換します。
     *
     * @param \Illuminate\Http\Request $request
     * @return 配列
     */
    パブリック関數(shù) toArray($request)
    {
        戻る [
            'id' => $this->id,
            '名前' => $this->人の名前,
            'スキル' => $this->whenLoaded('スキル', function () {
                return $this->skills->pluck('name_of_skill'); // 名前を直接取得する // SkillResource が定義されている場(chǎng)合は、次のようにすることもできます。
                // return SkillResource::collection($this->skills->pluck('name_of_skill')); // SkillResource には名前のみが必要であると仮定します})、
        ];
    }
}

コントローラーでリソースを使用します。

 // アプリ/Http/Controllers/personController.php
名前空間 App\Http\Controllers;

App\Models\Personal を使用します。
App\Http\Resources\PersonResource を使用します。
Illuminate\Http\Request を使用します。

クラス PersonController はコントローラーを拡張します
{
    パブリック関數(shù)インデックス()
    {
        $persons = 人::with('スキル')->get();

        // PersonResource::collection() を使用してコレクションを処理します return PersonResource::collection($persons);
    }

    public function show(person $person)
    {
        // 一人の人の場(chǎng)合、スキルがロードされていることを確認(rèn)してください
        $person->load('スキル');
        新しい PersonResource($person) を返します。
    }
}

$this->whenLoaded('skills', ...) は、スキル関係がプリロードされている場(chǎng)合にのみクロージャー內(nèi)のロジックが実行されるようにする、非常に便利なヘルパー関數(shù)です。これにより、不要なクエリが回避され、リソースがより堅(jiān)牢になります。

5. 予防措置とベストプラクティス

  • プリロードには常に with() を使用します。これは、特にコレクションを扱う場(chǎng)合に、N 1 クエリの問題を回避する鍵となります。
  • 適切なツールを選択します。単純な書式設(shè)定が必要な場(chǎng)合は、map() と pluck() の組み合わせが非常に効率的です。複雑な API 応答、條件付きフィールド、ネストされたリソースなどの場(chǎng)合は、構(gòu)造と保守性が向上する API リソースの方が推奨されます。
  • パフォーマンスの最適化:スキルのコレクションが非常に大きい場(chǎng)合、pluck() 操作は一定量のメモリを消費(fèi)する可能性があります。極端な場(chǎng)合には、データベース レベルでのより洗練されたクエリの最適化を検討できますが、ほとんどのシナリオでは、Eloquent のプリロードとプルは十分に効率的です。
  • 明確な名前付け:モデル、リレーションシップ、データベース フィールドの名前付けの一貫性と明確さを維持すると、コードの可読性と保守性が大幅に向上します。

要約する

このチュートリアルを通じて、Laravel Eloquent の with() メソッドを使用して多対多の関係をプリロードする方法と、map() メソッドと pluck() メソッドを使用して関連モデルの特定の列データを抽出して配列にフォーマットする方法を?qū)Wびました。さらに、API 応答のデータ構(gòu)造を統(tǒng)合して最適化するための、より専門的で柔軟なソリューションである Laravel API リソースの使用も検討しました。これらのスキルを習(xí)得すると、Laravel で複雑なデータ関係をより効率的かつエレガントに処理し、高パフォーマンスの Web アプリケーションや API を構(gòu)築できるようになります。

以上がLaravel Eloquent: 多対多の関係で特定の列の配列形式のデータを効率的に取得するの詳細(xì)內(nèi)容です。詳細(xì)については、PHP 中國語 Web サイトの他の関連記事を參照してください。

このウェブサイトの聲明
この記事の內(nèi)容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰屬します。このサイトは、それに相當(dāng)する法的責(zé)任を負(fù)いません。盜作または侵害の疑いのあるコンテンツを見つけた場(chǎng)合は、admin@php.cn までご連絡(luò)ください。

ホットAIツール

Undress AI Tool

Undress AI Tool

脫衣畫像を無料で

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Stock Market GPT

Stock Market GPT

AIを活用した投資調(diào)査により賢明な意思決定を?qū)g現(xiàn)

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

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

SublimeText3 中國語版

SublimeText3 中國語版

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

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強(qiáng)力な PHP 統(tǒng)合開発環(huán)境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

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

ホットトピック

メールアドレスがPHPで有効かどうかを確認(rèn)する方法は? メールアドレスがPHPで有効かどうかを確認(rèn)する方法は? Sep 21, 2025 am 04:07 AM

usefilter_var()tovalidateemailsyntaxandcheckdnsrr()toverifydomainmxrecords.example:$ email = "user@example.com"; if($ email、filter_validate_email)

PHPでオブジェクトの深いコピーまたはクローンを作成する方法は? PHPでオブジェクトの深いコピーまたはクローンを作成する方法は? Sep 21, 2025 am 12:30 AM

useunserialize(serialize($ obj))fordeepcopying whenalldataisserializable;それ以外の場(chǎng)合は、__clone()tomaniallyduplicatededededededavoidsharedReferenceを?qū)g裝します。

PHPで2つの配列をマージする方法は? PHPで2つの配列をマージする方法は? Sep 21, 2025 am 12:26 AM

usearray_merge()tocombinearrays、urblitingduplicatestringkeysandreindexingnumerickeys; forsimplerconcatenation、inthphp5.6、usethesplatoperator [... $ array1、... $ array2]。

PHPプロジェクトで名前空間を使用する方法は? PHPプロジェクトで名前空間を使用する方法は? Sep 21, 2025 am 01:28 AM

NamesSpacesInphporganizeCodeandPreventnamingConflictsByGroupingClasses、インターフェイス、関數(shù)、およびコンテンダントアンダースピフィクティフィクティフィクティフィクティフィクショナル

PHPを使用してデータベースでレコードを更新する方法は? PHPを使用してデータベースでレコードを更新する方法は? Sep 21, 2025 am 04:47 AM

toupdateadatabaserecordinphp、firstconnectusingpdoormysqli、thenuseprepreadedStatementStoeaseaseesecuresQlupDateQuery.example:$ pdo = newpdo( "mysql:host = localhost; dbname = your_database"、$ username、$ username、$ sibsfar

PHPの魔法の方法とは何ですか? `__call()`および `__get()`の例を提供します。 PHPの魔法の方法とは何ですか? `__call()`および `__get()`の例を提供します。 Sep 20, 2025 am 12:50 AM

the__call()メソッドは、customhandlingbyacceptingthemetodnameandarguments、ashownwhencollingdsslikesayhello()

PHPでファイル拡張機(jī)能を取得するにはどうすればよいですか? PHPでファイル拡張機(jī)能を取得するにはどうすればよいですか? Sep 20, 2025 am 05:11 AM

usepathinfo($ filename、pathinfo_extension)togetthefileextension; itreliailailavaliavelyhandlesmultipledotsendedgecases、returningtheextension(例えば、 "pdf")oranemptystringifnoneexists。

PHPでファイルのzipアーカイブを作成する方法は? PHPでファイルのzipアーカイブを作成する方法は? Sep 18, 2025 am 12:42 AM

ziparchiveクラスを使用して、zipファイルを作成します。最初にターゲットZIPをインスタンス化して開き、AddFileを使用してファイルを追加し、カスタム內(nèi)部パスをサポートし、再帰関數(shù)はディレクトリ全體をパッケージ化でき、最終的にはPHPに書き込みアクセス許可があることを確認(rèn)するために保存します。

See all articles