コンテンツをフィルタリングするための複数のテーブルとの Laravel 結合
この記事では、Laravel を使用してソーシャル メディア プラットフォームを構築するときに直面する一般的な課題に対処します: 複数のテーブル間の複雑な関係に基づいて特定のコンテンツを取得します。生の SQL クエリと Laravel Eloquent ORM の両方を使用した包括的なソリューションを提供します。
問題ステートメント
目的は、投稿を表示する Twitter のようなフィードを構築することです。現在のユーザーがフォローしているユーザーからのみ。これを実現するには、次の条件に基づいて「Shares」テーブルをフィルタリングする必要があります:
SQL ソリューション
提供された元の SQL クエリは正しいように見えますが、結合順序と条件には若干の調整が必要です。正しく動作します。次の修正された SQL クエリは、3 つのテーブルを効果的に結合し、指定されたフィルタリングを適用します。
$shares = DB::table('shares') ->join('users', 'users.id', '=', 'shares.user_id') ->join('followers', 'followers.user_id', '=', 'users.id') ->where('followers.follower_id', '=', 3) ->get();
あるいは、Eloquent ORM を使用すると、より洗練されたカプセル化されたアプローチが提供されます。これはモデルベースのソリューションです:
User.php (モデル)
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'); }
Share.php (モデル)
public function user() { return $this->belongsTo('User'); }
Controller.php (コントローラー)
$my = User::find('my_id'); $shares = Share::with('user') ->join('follows', 'follows.user_id', '=', 'shares.user_id') ->where('follows.follower_id', '=', $my->id) ->get(); foreach ($shares as $share) { echo $share->user->username; }
このアプローチは、より柔軟で保守可能なソリューションを提供し、データの整合性と効率的なクエリを保証します。
以上が現在のユーザーがフォローしているユーザーに基づいて投稿をフィルタリングする Twitter のようなフィードを構築するなど、複雑な関係に基づいて Laravel の複数のテーブルから特定のコンテンツを取得するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。