2016-09-14 9 views
0

のエントリを持っていない...我々は、MySQLのテーブルYii2、ActiveQuery、サブクエリは、私は解決策を見つけたことができないID

`users` 
id | username 
1  Mike 
2  John 
3  Jane 

`roles` 
userID | roleID 
1   2 
1   3 
3   1 

を持っているので、質問です - 私は1つのクエリで特定のroleIDをしていないすべてのユーザーを選択する必要があります。また、ユーザーはロール内の関係を持つことはできません(たとえば、JohnはroleIDを持たないので、すべてのクエリで選択する必要があります)。

単純なクエリはユーザーがあるroleIDを持っている場合です( - > joinWith()で確認できます)が、このクエリを逆にする必要があります。

私はoneToMany(users-> roles)の関係があり、Yii2 - > joinWith()は正しい方法で動作していないという問題があります(私が間違っていると思います)。

誰かがそれに対処できますか? Userモデルは、「役割」関係を持っており、$ excludedRoleIdは除外roleIdある場合

+0

としてクエリの上に生成するコードを書くことができますあなたがいずれかを持っていないすべてのユーザーを選択したいを前提に答えを与えていますあなたが本当に望んでいるかどうかを確認してください。 –

答えて

0

その後、上記の問題への単純なSQLクエリは、彼がどんな役割

を持っていないとの結果が「 ジョン」を返します

SELECT username 
FROM users 
WHERE id NOT IN (SELECT userID FROM roles) 

で、どんな役割を持っていますYii2で

、私は完全にproblem.Iを理解していない

$subQuery=Roles::find()->select('userID '); 

$query = Users::find()-> 
select("username")->where(['not in', 'id', $subQuery]); 

$models=$query->all(); 
1

、これは役割ではない役割またはユーザーせずにユーザーを返す$ excludedRoleId

そうしないすべてのユーザーを選択したい場合は
User::find() 
->joinWith(['roles']) 
->where('roles.userID IS NULL OR roles.userID NOT IN (SELECT userID FROM roles WHERE roleID = :roleId)', [':roleId' => $excludedRoleId]) 
->all(); 
+0

あなたはそれを確認しましたか? 'roles.roleID <>:roleId''この条件は別の役割を返すと思います。それ以外の役割は':roleId'以外です。例として、あるユーザがroleIDを持っている場合1,2,3、 'roles.roleID <> 2'をチェックするとroleID 1または3が得られ、ユーザが表示されます(間違っていますか?)。 私は同じことをしたので質問しています - 結果は間違っています。 – user1954544

+0

申し訳ありませんが、私は完全な要求を理解していません。私はコードを更新しました。今それは動作するはずです! –

関連する問題