ホームページ >データベース >mysql チュートリアル >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 サイトの他の関連記事を参照してください。