【问题标题】:Laravel 5 Joining One To Many Eloquent Models With AND ConditionsLaravel 5 使用 AND 条件连接一对多 Eloquent 模型
【发布时间】:2015-08-17 21:25:47
【问题描述】:

我正在使用 Laravel 5 开发人力资源系统。我有三个表,它们是带有外键employee_id 的 leave_applications、带有外键 department_id 的employees 表和部门表。现在我只想获取基于或使用部门 id 的休假申请.我该怎么做?

提前致谢

【问题讨论】:

  • 我使用了 hasManyThrough 关系,这样部门通过员工表有很多请假申请并且它正在工作。但是我还有另一个问题,我无法使用 leave_applications 表上的外键 leave_type_id 获取该休假类型名称

标签: laravel


【解决方案1】:

假设您正确设置了模型和关系:

$leave_applications = [];
Department::with(['employees.leave_applications' => function ($q) use (&$leave_applications) {
        $leave_applications = $q->get()->unique();
    }])
    ->findOrFail($id);

【讨论】:

    【解决方案2】:

    根据您的描述,听起来部门有很多员工,而员工有很多请假申请。通过此设置,您可以创建另一个关系:Department hasMany LeaveApplications Through Employees。

    class Department extends Model {
        public function employees() {
            return $this->hasMany('App\Employee');
        }
    
        public function leaveApplications() {
            return $this->hasManyThrough('App\LeaveApplication', 'App\Employee');
        }
    }
    

    现在您可以直接从部门获取所有请假申请:

    $department = Department::find($id);
    $leaveApplications = $department->leaveApplications;
    

    编辑

    回答 cmets 的问题

    根据您的字段描述,您的 LeaveApplication 属于 LeaveType,因此您的模型应如下所示:

    class LeaveApplication extends Model {
        public function leaveType() {
            return $this->belongsTo('App\LeaveType');
        }
    }
    

    现在您可以从 LeaveApplication 访问 LeaveType 名称:

    // add in eager loading to avoid N+1 queries
    $department = Department::with('leaveApplications.leaveType')->find($id);
    $leaveApplications = $department->leaveApplications;
    
    foreach($leaveApplications as $leaveApplication) {
        print_r($leaveApplication->leaveType->name);
    }
    

    您可以在文档here 中阅读有关 Laravel 关系的更多信息。

    【讨论】:

    • 非常感谢,一眨眼就可以完美运行。
    • 基于这种关系。 leave_applications 表有一个外键名称 leave_type_id,它引用 leave_types 表上的 id,现在我想将其附加到上述代码上并获取该特定休假类型的名称。我该怎么做。我尝试使用 join 没有成功再次感谢
    • 效果很好,但我也得到了相同的数据,只是使用控制器中的动态属性使用 LeaveApplication 模型中的方法。谢谢
    【解决方案3】:

    您可以为 leave_applications 表创建一个模型类,并将范围和关系放入该模型中:

    class LeaveApplication extends Model
    {
        public function scopeOfDepartment($query, $department)
        {
            return $query->where('department_id', '=', $department);
        }
    
        public function employee()
        {
            return $this->belongsTo('App\Employee');
        }
    }
    

    用法:

    $leaveApplications = LeaveApplication::ofDepartment($departmentId)->get();
    
    foreach ($leaveApplications as $application) {
        $employee = $application->employee;
    }
    

    【讨论】:

    • 根据帖子,leave_applications 有employee_id,而不是department_id。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-17
    • 1970-01-01
    • 2015-03-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多