gpt4 book ai didi

mysql - 通过数据透视表检查数据库中是否存在关系

转载 作者:可可西里 更新时间:2023-11-01 07:55:42 26 4
gpt4 key购买 nike

情况

用户可以属于多个组织,通过名为 employees 的数据透视表链接

模型在起作用:用户员工组织

相关数据库列:

users
- id

employees
- user_id
- organization_id

organizations
- id

目标

检查用户 1 和用户 2 是否在 employees 中至少共享一个 organization_id 的有效方法表格

用例

Api 端点 /api/v1/user/# 返回有关用户的附加元数据。

使用 policy,它检查当前用户和 url 中的用户 id 是否相同,或者他们都是至少一个组织的员工,organization_id 在这个阶段是未知的,重要的是它匹配。

例子A

用户 A (1) 是组织 foo (1) 的员工

用户B(2)是组织bar(2)的员工

因此employee表有如下记录:

+-----------------+---------+
| organization_id | user_id |
+-----------------+---------+
| 1 | 1 |
| 2 | 2 |
+-----------------+---------+

在此示例中,查询应返回错误结果,因为用户 A 和 B 之间没有共享 organization_id

示例 B

用户 A (1) 是组织 foo (1) 的员工

用户 A (1) 是组织 foobar (3) 的员工

用户B(2)是组织bar(2)的员工

用户 B (2) 是组织 foobar (3) 的员工

因此employee表有如下记录:

+-----------------+---------+
| organization_id | user_id |
+-----------------+---------+
| 1 | 1 |
| 2 | 2 |
| 3 | 1 |
| 3 | 2 |
+-----------------+---------+

在此示例中,查询应返回真实结果,因为用户 A 和 B 之间存在共享的 organization_id

政策代码

/**
* Determine whether the user can view the model.
*
* @param \App\User $user
* @param \App\User $model
* @return mixed
*/
public function view(User $user, User $model)
{
if ($user->is($model)) {
return true;
} else {
// check if users share at least one organization
}
}

有效但看起来效率不高的代码

foreach ($user->organizations()->with('users')->get() as $organization) {

if ($organization->users->where('id', $model->id)->first()) {
return true;
}

}

return false;

使用连接而不是使用 laravel 模型完成的实验代码

        \Illuminate\Support\Facades\DB::table('employees as auth_employee')
->join('employees as other_employee', 'other_employee.organization_id', '=', 'auth_employee.organization_id')
// ->join('organizations', 'organizations.id', '=', 'organizations.id')
->where('auth_employee.id', 1)
->where('other_employee.id', 2)
->get()

请求的解决方案

无论是否有 2 个用户在 employees 表上共享至少一个 organization_id,获取(可转换为) bool 结果的高效查询,“奖励积分”使用 laravel 模型/查询构建器。

页脚

感谢阅读,这是一个土 bean :🥔

最佳答案

假设您在 Organization 模型中设置了用户关系,您可以使用 whereHas方法:

$user->organizations()->whereHas('users', function ($query) use($model) {
$query->where('users.id', $model->id);
})->exists();

关于mysql - 通过数据透视表检查数据库中是否存在关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52220932/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com