Twitterのようなアプリを作成しています。自分がフォローしているユーザーの投稿のみを表示したいフィードがあります。
私はすべてを結合で試しましたが、何もうまくいかないようです。
3つのテーブルがあります:Users
、Followers
、Shares
テーブルは次のようになります。
ユーザー:id
フォロワー:user_id
、follower_id
共有:user_id
取得する必要があるのは、「すべての共有WHERE share.user_id = followers.follower_id」「ANDWHERE followers.user_id = users.id」です
Users.idが3であると仮定して、私はこれを試しました:
$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();
しかし、それは機能しません。
どんな助けも大歓迎です:)
あなたの参加は間違っていると思います:
$shares = DB::table('shares')
->join('users', 'users.id', '=', 'shares.user_id')
->join('followers', 'followers.user_id', '=', 'users.id')
->where('followers.follower_id', '=', 3)
->get();
また、テーブルにfollows
という名前を付けることをお勧めします。user has many followers through follows
およびuser has many followees through follows
と言う方が少し自然な感じがします。
例
$shares = DB::table('shares')
->join('users', 'users.id', '=', 'shares.user_id')
->join('follows', 'follows.user_id', '=', 'users.id')
->where('follows.follower_id', '=', 3)
->get();
モデルではなくDB::
クエリを使用していることに気づきませんでした。そのため、答えを修正し、より明確にしています。モデルを使用することをお勧めします。フレームワークと特にSQLを使用している人にとっては、はるかに簡単です。
モデルの例:
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');
}
}
モデルの使用例:
$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;
}
// Retrieves all users I'm following
$my->followees;
// Retrieves all users that follows me
$my->followers;
一般的なMySQL構文の観点から、これは次のように記述するのが最適です。
SELECT * FROM USER a JOIN FOLLOWERS b ON (a.id = b.user_id) JOIN SHARES c on (b.follower_id = c.user_id) WHERE a.id = 3
すべてのフォロワーとそれぞれのシェアのデータセットを返します。
Laravelで次のものが欲しいと思う
DB::table('USER')
->join('FOLLOWERS', 'USER.id', '=', 'FOLLOWERS.user_id')
->join('SHARES', 'FOLLOWERS.follower_id', '=', 'SHARES.user_id')
->where('USER.id', 3)
->get();
の代わりに
->where('shares.user_id', 'followers.follower_id')
そのはず
->whereRaw('shares.user_id=followers.follower_id')
元の例では、「followers.follower_id」が文字列として解釈されるためです。
$shares = DB::table('users')
->leftjoin('followers', 'users.user_id', '=', 'followers.follower_id')
->leftjoin('shares', 'shares.user_id', '=', 'users.id')
->where('users.id', 3)
->get();
ご覧ください
$data[shares] = DB::table('shares')
->leftjoin('followers', 'shares.user_id', '=', 'followers.follower_id')
->leftjoin('users', 'users.id', '=', 'users.id')
->where('users.id','=', 3)
->get();
結果を確認します。
print_r($data[shares]);die;
他のクエリの場合は、単にテーブルの説明を入力してください