Laravel: 具有whereHas 和多对多关系的全局范围
Laravel: Global scope with whereHas and many-to-many relationshipi
我想按关系字段进行全局范围过滤。
// 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);
versions 是 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)
});
有什么想法吗?
我还没有解决这个问题,但我找到了避免它的方法。我不知道为什么会这样:
如果我有以下查询并且 id 是唯一的,我不会得到任何结果。但是,如果 id 不是唯一的,我会得到预期的结果;所以我决定删除唯一的,直到找到另一个解决方案。
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
的错误
我想按关系字段进行全局范围过滤。
// 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);
versions 是 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)
});
有什么想法吗?
我还没有解决这个问题,但我找到了避免它的方法。我不知道为什么会这样:
如果我有以下查询并且 id 是唯一的,我不会得到任何结果。但是,如果 id 不是唯一的,我会得到预期的结果;所以我决定删除唯一的,直到找到另一个解决方案。
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
的错误