2017-06-02 8 views
0

例:私のアプリケーションにこれらのモデルがあります。 User,Profile,Interest複数の関連モデルをクエリするLaravel

profilesテーブルにuser_idの列を追加することで、テーブルをprofilesテーブルにリンクしました。そして、私はピボットテーブル(interest_profile)を使用してprofilesinterestsをリンクしました。これは2つの列(profile_id,)を持つことは明らかです。

しかし、プロファイルに関連付けられているユーザーにクエリを行い、特定のユーザーが関心を持つユーザーを表示したいとします。つまり、「プロファイル内にその特定の興味を持っているすべてのユーザーを選択してください」。

私はこれを4つのテーブルを結合して(where句を使用して)生のSQLで行うことができることを知っています。しかし、私はそれをLaravelの方法で行いたいと思います。

ありがとうございます。 Userモデルを仮定

答えて

1

最初にあなたのようなあなたのモデルに正しくあなたの関係を設定していることを確認してください。したがって、クエリは次のようになります。

User::whereHas('profile.interests', function($query) use ($interestName) { 
    return $query->where('name', $interestName); 
})->get(); 

これは、ユーザーのコレクションを返すだけです。プロファイルと関心を返す場合は、with()

User::whereHas('profile.interests', function($query) use ($interestName) { 
    return $query->where('name', $interestName); 
}) 
->with('profile.interests') 
->get(); 
1

関係profileを持っており、Profileモデルが関係interestsを持って、あなたはこれを行うことができます。次に、ネストされた関係の関連モデルとドット表記法により、クエリを制約するwhereHas()を使用することができます

class User extends Model 
{ 
    public function profile() 
    { 
     return $this->hasOne(Profile::class); 
    } 
} 

class Profile extends Model 
{ 
    public function user() 
    { 
     return $this->belongsTo(User::class); 
    } 

    public function interests() 
    { 
     return $this->belongsToMany(Interest::class, 'interest_profile'); 
    } 
} 

class Interest extends Model 
{ 
    public function profiles() 
    { 
     return $this->belongsToMany(Profile::class, 'interest_profile'); 
    } 
} 

$interest_id = 1; 

$users = User::whereHas('profile', function ($query) use ($interest_id) { 
    $query->whereHas('interests', function ($query) use ($interest_id) { 
     $query->where('id', $interest_id); 
    }); 
})->get(); 
関連する問題