Laravel与多个外键和数据透视表的关系

时间:2018-08-23 10:43:48

标签: php mysql database laravel eloquent

我对laravel很陌生,我有四个表,employee,jobs,applied_jobs和employee_profile_picture:  enter image description here][1

员工与工作有很多关系

员工模型:

class Employee extends Authenticatable {

    public function employeeProfilePhoto() {
        return $this->hasMany('App\Models\EmployeeProfilePhoto', 'employee_id');
    }

    public function jobsApplied() {
        return $this->belongsToMany(Job::class, 'jobs_applieds', 'employee_id', 'job_id')
            ->withPivot('cover_letter', 'cv_path','created_at')
            ->orderBy('pivot_created_at','desc');
    }
}

工作模式:

class Job extends Model {

    public function appliedByEmployees() {
        return $this->belongsToMany(Employee::class, 'jobs_applieds', 'job_id', 'employee_id')
            ->withPivot('cover_letter', 'cv_path','employee_application_status');
    }

}

员工资料照片模型:

class EmployeeProfilePhoto extends Model {

    protected $table = 'employees_profile_photos';

    public function employeePhoto() {
        return $this->belongsTo(Employee::class, 'employee_id');
    }
}

我想获得所有申请了工作的雇员及其个人资料图片,其中loyal_id与工作表中的某些ID相匹配。我想雄辩地使用laravel。如何实现

4 个答案:

答案 0 :(得分:1)

如果要按特定ID进行过滤:

''

如果您只希望申请工作的员工:

$employee = Employee::whereHas('jobsApplied', function ($query) use ($someId) {
    $query->where('employee_id', $someId);
})
->with('employeePhoto')
->get();

whereHas()它是一种雄辩的功能,可以根据您的情况检查关系是否存在,它将仅获取已申请工作的员工,或者您可以根据特定需求(例如employee id)对条件进行子查询。

答案 1 :(得分:0)

我建议以下答案

for item in data:
    print(item['moid_au'])

我不知道你是什么问题。

答案 2 :(得分:0)

您可以尝试执行以下操作,以获取所有雇员的个人资料照片,其中该雇员已被申请工作并与employer_id表中的jobs相匹配:

$employer_id = 'get the employer_id...';

$result = Employee::whareHas('jobsApplied', function($query) use ($employer_id) {
    $query->where('employer_id', $employer_id);
})->with('employeeProfilePhoto', 'jobsApplied')->get();

答案 3 :(得分:-1)

我认为至少有三种方法可能适合您的方法。

从Job部门查询并使用with语句加载员工,以使其热切加载。通过使用.,我们也可以急于加载嵌套的关系,例如所需的图像。这样,与此工作相关的员工将已经加载了他们的图像。您可以添加尽可能多的关系,以急切地加载到随附的数组中。

我从使用Job::where的Job实例中实例化了一个空模型,因此不必查找主键的命名方式即可使用$model->getKeyName()

$model = new Job();
$query = $model->newQuery()->where($model->getKeyName(), $job_id);
$query->with(['appliedByEmployees.employeeProfilePhoto']);
if($result = $query->first()) {
    $results = $result->appliedByEmployees;
    echo dump($results);
}

或者使用引用从子查询中获取结果,即可获得所需的所有结果。当您已经有复杂的查询来找到所需的工作时,这特别有用。

请注意,我在函数参数括号后面使用了use语句。这有助于将周围范围的值放入函数的范围,否则用于优化查询的函数将不知道$ job_id的值,并且会为未定义的变量引发错误。

$model = new Job();
$results = null;
$query = $model->newQuery()->where($model->getKeyName(),$job_id);
$query->with(['appliedByEmployees' =>function($query) use (&$results) {
   $results = $query->with('employeeProfilePhoto')->get();
}]);
echo dump($results);

或者您可以从员工角度进行攻击。在这里,我通过$model->jobsApplied()访问关系定义,其中包含一些有用的方法,例如getRelated(),它将返回关系船中定义的模型的空实例。这使您可以在将来需要时“交换”作业的关系模型,并且您实际上不必担心主键字段的命名方式。

$model = new Employee();
$relation = $model->jobsApplied();
$related_model = $relation->getRelated();
$query = $model->newQuery()->whereHas('jobsApplied',function($query) use ($job_id, $related_model) {
    $query->where($related_model->getKeyName(), $job_id);
});
$query->with('employeeProfilePhoto');
$results = $query->get();
echo dump($results);