sql >> データベース >  >> RDS >> Mysql

Laravelが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();
    

    また、テーブルに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;
    


    1. SQLServerの概要

    2. SQLite Count()をGROUP BYと組み合わせて、結果セットに「カウント」列を追加します

    3. バックエンドデータベースが新しい場所に移動した後、Access2016でリンクされたテーブルを更新する方法

    4. SqlServer:ユーザーのログインに失敗しました