リレーションのフィールドでグローバルスコープフィルタリングを行いたい。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)
});
のバグが 'whereHasを変更しようとするの制限である場合、私は知りません'<...>' –
Oups、申し訳ありません。元のコードは 'where'ではありませんでした '、'コードを投稿するときに間違いを犯しました。 – kanashin