ホームページ  >  記事  >  データベース  >  Laravel で 3 つのテーブルを効率的に結合して、フォローされているユーザーから投稿を取得する方法

Laravel で 3 つのテーブルを効率的に結合して、フォローされているユーザーから投稿を取得する方法

Linda Hamilton
Linda Hamiltonオリジナル
2024-10-25 07:09:29955ブラウズ

How to Efficiently Join Three Tables in Laravel to Retrieve Posts from Followed Users?

Laravel: データ取得のための 3 つのテーブルの結合

このシナリオでは、現在のユーザーからの投稿を表示する必要がある Twitter のようなアプリケーションを構築しています。ユーザーがフォローしています。 Users、Followers、Shares という 3 つのテーブルがあるため、目的のデータを取得するには、それらを効果的に結合する方法を理解することが重要です。

目標は、Shares テーブルの user_id が一致するすべての Share を取得することです。 Followers テーブルの follower_id、Followers テーブルの user_id は Users テーブルの id と一致します。

データベース クエリ ビルダーの使用

次のクエリを使用しようとしました:

<code class="php">$shares = DB::table('shares')
    ->leftjoin('followers', 'shares.user_id', '=', 'followers.follower_id')
    ->leftjoin('users', 'followers.user_id', '=', 'users.id')
    ->where('users.id', 3)
    ->where('shares.user_id', 'followers.follower_id')
    ->get();</code>

ただし、このクエリの問題は、共有とフォロワーの結合条件にあります。正しい結合は次のようになります:

<code class="php">->leftjoin('followers', 'shares.user_id', '=', 'followers.user_id')</code>

機能強化のためのモデルの使用

データベース クエリ ビルダーを使用する代わりに、データベース操作へのより構造化された効率的なアプローチのために Laravel モデルを使用することをお勧めします。 .

モデルを定義する方法は次のとおりです:

<code class="php">class User extends Model {
    public function shares() {
        return $this->hasMany('Share');
    }
    public function followers() {
        return $this->belongsToMany('User', 'follows', 'user_id', 'follower_id');
    }
    public function followees() {
        return $this->belongsToMany('User', 'follows', 'follower_id', 'user_id');
    }
}
class Share extends Model {
    public function user() {
        return $this->belongsTo('User');
    }
}</code>

モデルを使用したクエリの実行

モデルを定義したら、次のようなクエリを実行できます:

<code class="php">$my = User::find('my_id');

// Retrieves all shares by users that I follow
// eager loading the "owner" of the share
$shares = Share::with('user')
    ->join('follows', 'follows.user_id', '=', 'shares.user_id')
    ->where('follows.follower_id', '=', $my->id)
    ->get('shares.*'); // Notice the shares.* here

// prints the username of the person who shared something
foreach ($shares as $share) {
    echo $share->user->username;
}</code>

この例では、クエリは Shares テーブルの user_id が Followers テーブルの follower_id と一致し、Followers テーブルの user_id が $my 変数に格納されている現在のユーザー ID と一致するすべての Share を取得します。

以上がLaravel で 3 つのテーブルを効率的に結合して、フォローされているユーザーから投稿を取得する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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