Laravel:全球范围,其中有多个多对多关系

时间:2016-05-12 17:16:57

标签: mysql unique exists

我想通过关系字段进行全局范围过滤。

// 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()返回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专家,所以我真的不明白如何使用JOIN工作EXISTS子查询。

但我知道如果我做下一个代码的事情一切正常。但我需要过滤所有查询,所以我认为我需要一个全局范围。

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

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

我还没有解决这个问题,但我找到了如何避免这个问题。我不知道为什么会这样讨厌:

如果我有以下查询且ID是唯一的,我不会得到任何结果。但是,如果id不是UNIQUE,我会得到预期的结果;所以我决定删除这个独特的,直到找到另一个解决方案。

UndefVarError: save not defined in include_string at loading.jl:288 in eval at
C:\Julia\PkgDir\v0.4\Atom\src\Atom.jl:3 [inlined code] from 
C:\Julia\PkgDir\v0.4\Atom\src\eval.jl:39 in anonymous at 
C:\Julia\PkgDir\v0.4\Atom\src\eval.jl:108 in withpath at 
C:\Julia\PkgDir\v0.4\Requires\src\require.jl:37 in withpath at 
C:\Julia\PkgDir\v0.4\Atom\src\eval.jl:53 [inlined code] from 
C:\Julia\PkgDir\v0.4\Atom\src\eval.jl:107 in anonymous at task.jl:58

我不知道这是EXISTS子查询的限制还是MySQL 5.7.12的错误