Я хочу сделать глобальную фильтрацию области по полю отношения.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 и версия() возвращает объект Version.
Однако я зарегистрировал запрос и показывает что-то вроде этого:
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 = ?
)
EXISTS подзапрос работает нормально, если это первое соотношение, например:
id|user_id|version_id
1 |1 |1
2 |1 |2
Запрос работает отлично, если version_id = 1, но я получаю пустой результат, если version_id = 2. Я не эксперт по MySQL, поэтому я не понимаю, как работает подзапрос EXISTS с JOIN внутри.
Но я вижу, что я делаю что-то вроде следующего кода, все работает нормально. Но мне нужно отфильтровать все запросы, поэтому я думаю, что мне нужна глобальная область.
User::whereHas('versions', function($query) {
return $query->where('version_id', version()->id)
});
Любые идеи?
Попробуйте изменить 'whereHas («version_id»<...>' 'простому где ('version_id '<...> ' –
Oups, извините. Оригинальный код был с' where 'not' whereHas ', я сделал ошибку при публикации кода. – kanashin