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

目次
1. 多対多の関係モデルを理解する
2. Eloquent モデルの関係を定義する
3.関連データのプリロード(メソッドあり)
4. データ変換とフォーマット (抽出とマップ)
5. 出力の最適化: Laravel API リソースを使用します (オプションですが推奨)
6. 注意事項と概要
ホームページ バックエンド開発 PHPチュートリアル Laravel 雄弁な多対多の関係: 特定のフィールド データを効率的に取得してフォーマットする

Laravel 雄弁な多対多の関係: 特定のフィールド データを効率的に取得してフォーマットする

Oct 16, 2025 pm 06:48 PM

Laravel 雄弁な多対多の関係: 特定のフィールド データを効率的に取得してフォーマットする

この記事は、Laravel Eloquent で多対多の関係データを効率的に処理する方法を読者にガイドすることを目的としています。関連テーブルから特定の列 (スキル名など) を抽出し、それらをターゲットの配列構造にフォーマットする方法 (キャラクターとそのすべてのスキル名を簡潔な JSON オブジェクトに編成するなど) に焦點を當てます。このチュートリアルでは、プリロードを使用したデータ変換の実踐的なガイドライン、抽出メソッドについて説明し、API リソースの高度な使用法について簡単に説明します。

1. 多対多の関係モデルを理解する

Laravel で多対多のリレーションシップを扱う場合、通常、2 つのメイン テーブル (person_table や skill_table など) と中間ピボット テーブル (person_skill またはピボット テーブル) の 3 つのテーブルが関係します。

  • person_table : ID、人物の名前などの人物情報を格納します。
  • skill_table : ID、スキル名などのスキル情報を格納します。
  • person_skill (ピボット テーブル) : person_table_id、skill_table_id を含む人とスキルを関連付けます。

私たちの目標は、次の構造のような出力を取得することです。

 {
  「id」: 1、
  "名前": "ハラット",
  「スキル」: [
    "php"、
    「ララベル」、
    "反応js"、
    「ノード」
  】
}

2. Eloquent モデルの関係を定義する

まず、多対多の関係を Eloquent モデルで正しく定義する必要があります。 Person と Skill という 2 つのモデルがあるとします。

app/Models/person.php

 <?php 名前空間 App\Models;

Illuminate\Database\Eloquent\Factories\HasFactory を使用します。
Illuminate\Database\Eloquent\Model を使用します。

クラス パーソン がモデルを拡張する
{
    HasFactoryを使用します。

    protected $table = &#39;person_table&#39;; // テーブル名が正しいことを確認してください/**
     * パーソンとスキルの間には多対多の関係があります*/
    パブリック関數(shù)スキル()
    {
        return $this->belongsToMany(Skill::class, 'person_skill', 'person_table_id', 'skills_table_id');
    }
}

app/モデル/スキル.php

 <?php 名前空間 App\Models;

Illuminate\Database\Eloquent\Factories\HasFactory を使用します。
Illuminate\Database\Eloquent\Model を使用します。

クラススキルはモデルを拡張します
{
    HasFactoryを使用します。

    protected $table = &#39;スキルテーブル&#39;; // テーブル名が正しいことを確認してください/**
     * スキルと人物の間には多対多の関係があります*/
    公的機能の人()
    {
        return $this->belongsToMany(person::class, 'person_skill', 'skills_table_id', 'person_table_id');
    }
}

3.関連データのプリロード(メソッドあり)

N 1 クエリの問題を回避し、パフォーマンスを向上させるには、with() メソッドを使用して関連するスキル データをプリロードする必要があります。

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

// すべてのキャラクターとその関連スキルを取得 $persons = Person::with('skills')->get();

// 1 人だけを取得する必要がある場合 // $person = Person::with('skills')->first();

上記のクエリを実行すると、$persons は Collection オブジェクトになります。このオブジェクトには、各 Person モデル インスタンスにスキル屬性が含まれます。これ自體は、関連するすべてのスキル モデル インスタンス (例: id: 1、name: php など) を含む Collection です。

4. データ変換とフォーマット (抽出とマップ)

データをプリロードするだけでは、目的の出力形式を実現(xiàn)するのに十分ではありません。さらに一歩進んで、スキル コレクションから名前フィールドを抽出し、それを単純な文字列配列に変換する必要があります。これは、pluck() メソッドと map() メソッドを組み合わせることによって実現(xiàn)できます。

  • pluck('name') : コレクション內の各モデル インスタンスから指定されたフィールドの値を抽出し、新しいコレクションを返すために使用されます。
  • map(function (person $person) { ... }) : コレクション內の各要素を反復処理し、コールバック関數(shù)を適用して各要素を変換し、新しいコレクションを返すために使用されます。

必要な形式を実裝するコード例を次に示します。

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

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

$formattedPersons = $persons->map(function (person $person) {
    戻る [
        'id' => $person->id,
        'name' => $person->name_of_person, // 個人名フィールドが name_of_person であると仮定します
        'skills' => $person->skills->pluck('name_of_skill')->toArray(), // スキル名を抽出して配列に変換];
});

// 結果を JSON 形式に変換する必要がある場合 // return response()->json($formattedpersons);

// PHP で配列を使用しているだけの場合 // $resultArray = $formattedPersons->toArray();

この例では:

  1. まず Person::with('skills')->get() を使用して、すべてのキャラクターとその関連スキルを取得します。
  2. 次に、$persons コレクションの map() メソッドを呼び出します。コレクション內の各人物モデルについて:
    • ID と名前を含む新しい連想配列を返します。
    • $person->skills はスキル モデル コレクションを返します。
    • $person->skills->pluck('name_of_skill') は、この Skill コレクションからすべての name_of_skill フィールドの値を抽出して、['php', 'laravel'] などの新しいコレクションを形成します。
    • .toArray() は、この抽出されたコレクションを PHP ネイティブ配列に変換します。

最終的に $formattedPersons は、各要素が期待するフォーマットされた配列である Collection になります。

5. 出力の最適化: Laravel API リソースを使用します (オプションですが推奨)

より複雑な API 応答や、均一な形式の出力が必要なシナリオの場合、Laravel の API リソースは非常に強力なツールです。 Eloquent モデルをカスタム JSON 構造に変換し、バージョン管理や條件付きフィールドなどの高度な機能を提供します。

リソースの作成:

 php 職人 make:resource PersonResource

app/Http/Resources/personResource.php

 <?php 名前空間 App\Http\Resources;

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

クラス PersonResource は JsonResource を拡張します
{
    /**
     * リソースを配列に変換します。
     *
     * @param \Illuminate\Http\Request $request
     * @return 配列|\Illuminate\Contracts\Support\Arrayable|\JsonSerializable
     */
    パブリック関數(shù) toArray($request)
    {
        戻る [
            &#39;id&#39; => $this->id,
            'name' => $this->name_of_person, // 個人名フィールドは name_of_person であると仮定します
            'スキル' => $this->whenLoaded('スキル', function () {
                return $this->skills->pluck('name_of_skill')->toArray();
            })、
            // 'skills' => SkillResource::collection($this->whenLoaded('skills')), // スキルにもより複雑なリソース変換が必要な場合];
    }
}

コントローラーで使用:

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

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

        戻り値 PersonResource::collection($persons);
    }

    パブリック関數(shù) show($id)
    {
        $person = Person::with('skills')->findOrFail($id);

        新しい PersonResource($person) を返します。
    }
}

whenLoaded('skills', ...) メソッドは、スキル関係がプリロードされる場合にのみスキル データが含まれるようにします。これは、條件付き読み込みを処理するエレガントな方法です。

6. 注意事項と概要

  • N 1 クエリの問題: ループ內のモデルごとに追加のデータベース クエリを実行することを避けるために、常に with() メソッドを使用して関連データをプリロードします。
  • コレクションと配列: 雄弁なクエリは、ネイティブの PHP 配列ではなくコレクション オブジェクトを返します。ネイティブ配列が必要な場合は、必ず toArray() メソッドを呼び出してください。
  • フィールド名: pluck() およびモデル屬性にアクセスするときは、必ず正しいデータベース フィールド名 (たとえば、name の代わりに name_of_skill) を使用してください。
  • 柔軟性: map() メソッドは優(yōu)れた柔軟性を備えており、ニーズに応じてコールバック関數(shù)で複雑なデータ変換を実行できます。
  • API リソース: 大規(guī)模なアプリケーションまたは API 開発の場合は、データ出力形式を統(tǒng)一および簡素化し、コードの保守性を向上させるために API リソースを使用することを強くお勧めします。

上記の方法により、Laravel Eloquent の多対多の関係から特定のフィールド データを効率的かつエレガントに抽出してフォーマットし、さまざまなビジネス ニーズを満たすことができます。

以上がLaravel 雄弁な多対多の関係: 特定のフィールド データを効率的に取得してフォーマットするの詳細內容です。詳細については、PHP 中國語 Web サイトの他の関連記事を參照してください。

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

ホット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を活用した投資調査により賢明な意思決定を実現(xiàn)

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

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

SublimeText3 中國語版

SublimeText3 中國語版

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

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

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

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

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

ホットトピック

メールアドレスがPHPで有効かどうかを確認する方法は? メールアドレスがPHPで有効かどうかを確認する方法は? 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;それ以外の場合は、__clone()tomaniallyduplicatededededededavoidsharedReferenceを実裝します。

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でファイル拡張機能を取得するにはどうすればよいですか? PHPでファイル拡張機能を取得するにはどうすればよいですか? 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を使用してファイルを追加し、カスタム內部パスをサポートし、再帰関數(shù)はディレクトリ全體をパッケージ化でき、最終的にはPHPに書き込みアクセス許可があることを確認するために保存します。

See all articles