php - 从数据透视表 Laravel 过滤的数据库中检索数据
问题描述
我有这样的表结构:
用户:
- ID
- 姓名
经理:
- ID
- 用户身份
用户经理:
- manager_id
- 用户身份
假期:
- 用户身份
- 日期_从...
我的任务是从用户 (vacations.user_id) 属于给定经理 ID (managers.user_id) 的假期表中获取所有数据,并且该分配位于数据透视表 user_manager 中。用户可以有多个管理员,管理员可以有多个用户。我一直在尝试这样做,但我陷入了困境。我的解决方法是这样的:
DB::table("vacations")
->leftJoin("users", function ($join) {
$join->on("vacations.user_id", "=", "users.id");
})
->leftJoin("user_manager", function ($join) {
$join->on("user_manager.user_id", "=", "users.id");
})
->where("user_manager.manager_id", "=", $id)
->get();
但我想知道一种用雄辩的模型和所有花哨的东西来制作它的方法。
经理型号:
class Manager extends Model
{
use HasFactory;
protected $table = 'managers';
protected $fillable = ['user_id'];
public function users()
{
return $this->belongsToMany(User::class, 'employee_manager')->withTimestamps();
}
}
用户型号:
class User extends Model
{
use HasFactory, Notifiable;
public function managers()
{
return $this->belongsToMany(Manager::class, 'employee_manager')->withTimestamps();
}
}
解决方案
您正在尝试获取由属于特定Vacation
的 a 创建的所有记录User
Manager
这意味着你需要得到所有的Vacations
地方user_id
Manager
users()
你可以用这样的基本方法来实现这一点;
$vacationsThatConcernTheManager = Vacation::whereIn('user_id', $manager->users()->pluck('id'))->get();
如果你想直接使用类似的东西,$manager->vacations()
你可以使用文档中描述的 hasManyThrough。
将此关系添加到您的Manager
模型中;
public function vacations()
{
return $this->hasManyThrough(Vacation::class, User::class);
}
推荐阅读
- android - BiometricManager.canAuthenticate() = BIOMETRIC_SUCCESS 但 BiometricPrompt.AuthenticationCallback() 在锁定时返回 errorCode 9
- google-tag-manager - FormSubmit 获取表单的数据属性
- kotlin - 最好地实现对调用层透明地发生的批处理 api 请求的设计模式
- c++ - Is there a way to seclude a loop in c++?
- bar-chart - Recharts 条形图显示带有“自动”标签的空条
- c# - 为什么带有 ADFS 的 OpenId 突然停止工作?
- python - 将本地 html 网页转换为 mhtml
- python-3.x - 使用标识符按列绘制时间序列
- firebase - 是否有可能对 Firestore 执行不区分大小写的“where”请求
- database - MongoDb对对象列表进行排序