2016-05-12 19 views
0

リレーションのフィールドでグローバルスコープフィルタリングを行いたい。Laravel:WhereHasと多対多の関係を持つグローバルスコープ

// The *apply* method of VersionScope file is: 
$builder->whereHas('versions', function ($query) { 
    return $query->where('version_id', '=', version()->id); 
}); 

// Users'boot method has this line after parent:boot(); 
static::addGlobalScope(new VersionScope); 

バージョンは(BelongsToMany関係とバージョン)バージョンのオブジェクトを返します。

id|user_id|version_id 
1 |1  |1 
2 |1  |2 

クエリが動作している:ザ・それは最初の関係であれば、サブクエリは、たとえば、正常に動作してEXISTS

select * 
from users 
where users.id = ? 
where exists (
    select * 
    from versions 
    inner join user_version on user_version.version_id = versions.id 
    where user_version.user_id = users.id 
    and user_version.version_id = ? 
) 

:私は、クエリをログに記録し、このような何かを見せているが

version_id = 1の場合は問題ありませんが、version_id = 2の場合は空の結果が得られます。MySQLのエキスパートではないので、内部でJOINを使用してEXISTSサブクエリをどのように処理するのか分かりません。

しかし、私は次のコードのようなことをすればすべてうまくいきます。しかし、私はすべてのクエリをフィルタリングする必要があるので、私はグローバルスコープが必要だと思う。

User::whereHas('versions', function($query) { 
    return $query->where('version_id', version()->id) 
}); 

+0

のバグが 'whereHasを変更しようとするの制限である場合、私は知りません'<...>' –

+0

Oups、申し訳ありません。元のコードは 'where'ではありませんでした '、'コードを投稿するときに間違いを犯しました。 – kanashin

答えて

0

私はこの問題を解決していませんが、回避する方法を見つけました。私はそれがなぜか分かりません:

私は次のクエリがあり、idが一意である場合、私は結果を得られません。しかし、idがUNIQUEでない場合は、結果を期待どおりに取得します。私は別の解決策が見つかるまで独特のものを取り除くことに決めました。

select * 
from users 
where users.id = ? 
where exists (
    select * 
    from versions 
    inner join user_version on user_version.version_id = versions.id 
    where user_version.user_id = users.id 
    and user_version.version_id = ? 
) 

これは(簡単な `どこ( 'VERSION_IDに` <...>「をversion_idの」サブクエリをEXISTSまたは多分MySQLの5.7.12