ホームページ > PHPフレームワーク > Laravel > Laravelで複数のテーブルを結合する方法

Laravelで複数のテーブルを結合する方法

WBOY
リリース: 2023-05-20 20:58:36
オリジナル
2505 人が閲覧しました

Laravel 開発では、複数テーブルの結合クエリが一般的な操作です。結合クエリでは、特定の条件に従って複数のテーブルのデータを結合し、必要なデータの結果セットを返すことができます。 Laravel で複数テーブルの結合クエリを実装するには、Eloquent ORM が提供する強力な関数を使用する必要があります。この記事では、Laravelの複数テーブル結合クエリの使い方を紹介します。

  1. Eloquent ORM

Laravel の Eloquent ORM は、データベースにアクセスして操作するための柔軟かつ簡単な方法を提供するオブジェクト リレーショナル マッピング (ORM) テクノロジです。 Eloquent ORM は、データベース テーブルをオブジェクトにマッピングすることでこれを実現します。これらのオブジェクトは PHP コードで操作でき、その状態はデータベースに永続化されます。 ORM の主な利点は、複雑な SQL ステートメントを単純なオブジェクト メソッド呼び出しに変換するため、開発者は SQL ステートメントではなくコード ロジックに集中できることです。

  1. 複数テーブルクエリ

Laravel は、複数テーブルの結合クエリを実装するためのさまざまなメソッドを提供します。その中で最も一般的な方法は、Eloquent correlation を使用することです。 Laravel の Eloquent ORM は強力な相関関数を提供するため、複数テーブルのクエリで Eloquent 相関を使用すると非常に便利です。以下に、一般的に使用される複数テーブルのクエリ方法をいくつか示します。

2.1 1 対 1 の関連付け

1 対 1 の関連付けとは、2 つのテーブル間に一致する行が 1 つだけ存在することを意味します。 Laravel で 1 対 1 の関連付けを実装するのは非常に簡単で、モデル内で hasOne メソッドまたはbelongsTo メソッドを定義するだけです。

たとえば、次の 2 つのテーブルについて考えてみましょう:

users

id ​​| name | email |password | created_at | updated_at

profiles

id | user_id |phone | address | created_at | updated_at

ユーザーのプロファイルを検索するには、User モデルで hasOne 関係を定義できます:

class User extends Model
{

public function profile()
{
    return $this->hasOne('AppModelsProfile');
}
ログイン後にコピー

}

次に、Profile モデルでbelongsTo メソッドを定義して関連付けを指定します。

class Profile extends Model
{

public function user()
{
    return $this->belongsTo('AppModelsUser');
}
ログイン後にコピー
ログイン後にコピー

}

これで、次のコードを使用してユーザーとそのプロフィールを取得できるようになります:

$user = User::with('profile')->find(1);

この例では、 with メソッドを使用して Eager Loading を実行します。これにより、ユーザーとそれに関連付けられたプロファイルが 1 つのクエリで取得され、冗長なクエリが回避されます。 find メソッドは、指定された ID を持つユーザーを検索するために使用されます。リレーションシップを定義するとき、Eloquent はデフォルトで外部キーに関連モデルの名前「_id」を付けることに注意してください (この例の「user_id」フィールドなど)。

2.2 1 対多の関連付け

1 対多の関連付けとは、1 つのテーブルの 1 つの行を別のテーブルの複数の行に関連付けることができることを意味します。 Laravel で 1 対多の関連付けを実装するのは非常に簡単で、モデル内で hasMany メソッドまたはbelongsTo メソッドを定義するだけです。

たとえば、次の 2 つのテーブルについて考えてみましょう:

users

id ​​| name | email |password | created_at | updated_at

posts

id | user_id | title | body | created_at | updated_at

ユーザーのすべての記事を検索するには、User モデルで hasMany 関係を定義できます:

class User extends Model
{

public function posts()
{
    return $this->hasMany('AppModelsPost');
}
ログイン後にコピー

}

次に、Post モデルでbelongsTo メソッドを定義して関連付けを指定します。

class Post extends Model
{

public function user()
{
    return $this->belongsTo('AppModelsUser');
}
ログイン後にコピー
ログイン後にコピー

}

次のコードを使用して、ユーザーとそのすべての投稿を取得できるようになりました:

$user = User::with('posts')->find(1) ;

この例では、Eloquent は現在のユーザー ID と等しい user_id を持つすべての投稿を自動的に検索し、それらをユーザー モデルの投稿属性として設定します。リレーションシップを定義するとき、Eloquent はデフォルトで外部キーに関連モデルの名前「_id」を付けることに注意してください (この例の「user_id」フィールドなど)。

2.3 多対多の関連付け

多対多の関連付けとは、2 つのテーブル間に複数の一致する行が存在する可能性があることを意味します。 Laravel で多対多の関連付けを実装するには、belongsToMany メソッドを使用する必要があります。

たとえば、次の 2 つのテーブルについて考えてみましょう:

users

id ​​| name | email |password | created_at | updated_at

roles

id | name | label | created_at | updated_at

中間テーブルroles_users

id ​​| user_id | role_id

指定されたロールを持つすべてのユーザーを検索するには、ロール モデル 所属先ToMany 関係を定義します。

class ロールはモデルを拡張します
{

public function users()
{
    return $this->belongsToMany('AppModelsUser');
}
ログイン後にコピー

}

次に、User モデル内にbelongsToMany メソッドを定義して、関連付けを指定します。 :

class User extends Model
{

public function roles()
{
    return $this->belongsToMany('AppModelsRole');
}
ログイン後にコピー

}

次のコードを使用して、指定されたロールを持つすべてのユーザーを取得できるようになりました:

$users = Role ::with('users')->where('name', 'admin')->get();

この例では、with メソッドを使用して実行します。 Eager Loading では、指定されたロールを持つすべてのユーザーを取得するために get メソッドが使用されます。多対多の関連付けには、2 つのテーブル間の関係をデータベースに保存するために使用される中間テーブルの存在が必要であることに注意してください。

  1. 概要

Laravel は、開発プロセスを簡素化する多くの便利な機能を提供する強力な Web 開発フレームワークであり、その 1 つが Eloquent ORM です。 Eloquent ORM は、複数テーブルの結合クエリなどのデータベースを処理するためのシンプルかつ強力な方法を提供します。 Laravel の Eloquent 相関の使用に慣れていれば、複数テーブルの結合クエリを実装するのは簡単です。

以上がLaravelで複数のテーブルを結合する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート