首页 > 解决方案 > 从数据透视表 Laravel 过滤的数据库中检索数据

问题描述

我有这样的表结构:

用户:

经理:

用户经理:

假期:

我的任务是从用户 (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();
    }
}

标签: phplaraveleloquent

解决方案


您正在尝试获取由属于特定Vacation的 a 创建的所有记录UserManager

这意味着你需要得到所有的Vacations地方user_idManagerusers()

你可以用这样的基本方法来实现这一点;

$vacationsThatConcernTheManager = Vacation::whereIn('user_id', $manager->users()->pluck('id'))->get();

如果你想直接使用类似的东西,$manager->vacations()你可以使用文档中描述的 hasManyThrough

将此关系添加到您的Manager模型中;

public function vacations()
{
    return $this->hasManyThrough(Vacation::class, User::class);
}

推荐阅读