29

私はTwitterのようなアプリを構築しています。フォローしているユーザーの投稿だけを表示したいフィードがあります。

結合ですべてを試しましたが、何も機能していないようです。

UsersFollowers、 の3 つのテーブルがあります。Shares

テーブルは次のようになります。

ユーザー:id

フォロワー: user_id,follower_id

シェア:user_id

私が取得する必要があるのは、「ALL Shares WHERE share.user_id = follower.follower_id」「ANDWHERE follower.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();

しかし、うまくいきません。

どんな助けでも大歓迎です:)

4

5 に答える 5

51

あなたの参加は間違っていると思います:

$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 followsand 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;
于 2013-08-22T19:20:41.607 に答える
1

一般的な 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();
于 2013-08-22T20:18:10.563 に答える
1

それ以外の

    ->where('shares.user_id', 'followers.follower_id')

そのはず

    ->whereRaw('shares.user_id=followers.follower_id')

元の例では、「followers.follower_id」が文字列として解釈されるためです。

于 2017-05-25T20:29:13.640 に答える
0
$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;

他のクエリの場合は、テーブルの説明を入力してください

于 2016-04-06T09:27:05.117 に答える