2016-05-12 3 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 и версия() возвращает объект 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) 
}); 

Любые идеи?

+0

Попробуйте изменить 'whereHas («version_id»<...>' 'простому где ('version_id '<...> ' –

+0

Oups, извините. Оригинальный код был с' where 'not' whereHas ', я сделал ошибку при публикации кода. – kanashin

ответ

0

Я не решил проблему, но я нашел, как ее избежать. Я не знаю, почему это так:

Если у меня есть следующий запрос и идентификатор UNIQUE, я не получаю никакого результата. Однако, если 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 = ? 
) 

Я не знаю, является ли это ограничение EXISTS подзапрос или, возможно, ошибка в MySQL 5.7.12