집 >데이터 베이스 >MySQL 튜토리얼 >팔로우된 사용자의 게시물을 검색하기 위해 Laravel에서 세 개의 테이블을 효율적으로 조인하는 방법은 무엇입니까?
이 시나리오에서는 현재 사용자의 게시물을 표시해야 하는 Twitter와 같은 애플리케이션을 구축하고 있습니다. 사용자가 팔로우 중입니다. Users, Followers 및 Shares라는 세 개의 테이블이 있으므로 원하는 데이터를 검색하려면 효과적으로 조인하는 방법을 이해하는 것이 중요합니다.
목표는 Shares 테이블의 user_id가 일치하는 모든 공유를 검색하는 것입니다. 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와 일치하는 모든 공유를 검색합니다.
위 내용은 팔로우된 사용자의 게시물을 검색하기 위해 Laravel에서 세 개의 테이블을 효율적으로 조인하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!