laravel关系

ebdffaop  于 2021-06-20  发布在  Mysql
关注(0)|答案(4)|浏览(334)

我对laravel很陌生,我有四个表格,雇员,工作,应用工作和雇员简介图片:

员工与乔布斯之间有着多对多的关系
员工模式:

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');
    }
}

我想得到所有的雇员和他们的个人资料图片谁申请了工作,其中雇主的id匹配的一些id在工作表。我想用拉威尔雄辩。如何做到这一点

relj7zay

relj7zay1#

您可以尝试以下方法来获取所有员工的个人资料照片,其中有一名员工申请了一份工作,并与 employer_idjobs 表格:

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

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

jei2mxaa2#

如果要按特定id筛选:

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

如果您只想要已申请工作的员工:

$employee = Employee::whereHas('jobsApplied')
    ->with('employeePhoto')
    ->get();
``` `whereHas()` 它是一个雄辩的函数,用于检查关系是否存在在您的案例中,它将仅获取已申请工作的员工,或者您可以根据特定的需要(例如employeee id)子查询条件。
nuypyhwy

nuypyhwy3#

我建议以下答案

Employee::with(['employeeProfilePhoto', 'jobsApplied'])->get();

我不知道你有什么问题。

yc0p9oo0

yc0p9oo04#

至少有三种方法适合你的方法。
从job pespective查询并使用with语句加载员工以使其急切地加载。通过使用 . 我们还可以急切地加载嵌套关系,比如您需要的图像。这样,与此工作相关的员工将加载他们的图像。可以在提供给的数组中添加任意多的关系以急切地加载。
我示例化了一个使用 Job::where 因此,不必查找主键是如何命名的 $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\u 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);

或者你可以从员工的Angular 来攻击。在这里,我通过 $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);

相关问题