可以问一下这个JOIN到底是干了啥?
Description
我最近使用apijson导致了一场严重级bug,所以解决后但是不知道为什么,还望解答!
这个是数据库关系:
其中框起来的表示要搜索的字段!
我一开始的apijson是这样的:
/** 获取我的分析列表 **/
export async function analysisListApi(params = {}, keysword) {
// 过滤为APIJSON参数格式
const data = {
"[]": {
join: `|/Project/projectId@`,
query: 2,
count: params.count,
page: params.page - 1
},
"total@": "/[]/total"
}
// 设置模糊查询参数
const likeList1 = keysword ? likeJoin(["taskName~", "taskId~", "projectId~"], keysword) : {}
const likeList2 = keysword ? likeJoin(["projectName~", "BNId~"], keysword) : {}
data["[]"][tableName] = {
isDelete: 0,
"@order": "taskCreateTime-",
// 表字段参数
...params.data,
...likeList1
}
data["[]"]["Project"] = {
uId: params.uId,
"projectId@": `/${tableName}/projectId`,
...likeList2
}
data["[]"]["User"] = {
id: params.uId,
"@column": "id,name,email",
"id@": `/${tableName}/uId`
}
delete data.data
return APIList(baseURL, tableName, data)
}
结果会导致用户可以看见别的用户的数据,将join: |/Project/projectId@,改成join: |/Project/projectId@,&/User/id@,可以是可以了,但是不清楚为什么,可以解答一下吗?
@TommyLemon
用 INNER JOIN 前没用 User 来过滤主表。 除了 JOIN,其它都是只有引用赋值时,下面的表依赖上面的表,没有反过来的情况。 https://github.com/Tencent/APIJSON/blob/master/Document.md#3.2
https://github.com/Tencent/APIJSON/issues/38#issuecomment-398801961
我懂了,其实我一开始我这里相当于,取出来了全部的 Task+Project 数据 FULL(并集),然后加上 &/User/id@ 后,相当于,我用这全部的数据又去用用户id过滤取了 INNER(交集),那我还是不理解这里为什么写上的 uId: params.uId 不是一个限制?
data["[]"]["Project"] = {
uId: params.uId,
"projectId@": `/${tableName}/projectId`,
...likeList2
}
@TommyLemon
直接浏览器抓包,或者断点调试源码,看看 params.uId 是不是传了空值
join 看起来比较复杂,我这边用的视图实现,你可以试试 更简单