在laravel多对多关系中生成更好的代码



hi我写了这段代码,它运行得很好,但我认为这不是最好的方法!

我想得到一家公司的所有工作。

每个公司可以有很多地址,每个地址可以有很多工作

这是我的代码:

$company = Company::find($id)->with('addresses.jobDetails.job')->first();
$jobs = [];
foreach ($company->addresses as $address) {
foreach ($address->jobDetails as $detail) {
array_push($jobs, [
'id' => $detail->job->id,
'title' => $detail->job->title,
'country' => $detail->job->country,
'city' => $detail->job->city,
'type' => $detail->job->type,
'work_types' => JobType::where('job_id',$detail->job->id)->pluck('title'),
'income' => $detail->income,
]);
}
}
return $jobs;

有人能帮我把这个改成更好的代码吗

提前感谢

相反,从JobDetails 开始

$jobDetails = JobDetail::whereHas('address.company', function($companyQuery) use($id) {
$companyQuery->where('id', $id);
})->whereHas('jobs', function($jobQuery) {
$jobQuery->where('is_active', 1);
})->with('jobs')->get();
foreach ($jobDetails as $detail) {
array_push($jobs, [
'id' => $detail->job->id,
'title' => $detail->job->title,
'country' => $detail->job->country,
'city' => $detail->job->city,
'type' => $detail->job->type,
'work_types' => JobType::where('job_id',$detail->job->id)->pluck('title'),
'income' => $detail->income,
]);
}
return $jobs;

编辑:

在您的查询中

Company::find($id)->with('addresses.jobDetails.job')->first();

您在急切加载的情况下运行了4个查询。每个型号一个。您可以检查得到的结果,即所有数据都存在于变量$company中。

在我给你的例子中,它只运行两个查询,第一个查询(job_details(将使用联接来根据companies表的id过滤job结果(你可以通过使用地址表中的字段company_id来加快速度(第二种是使用热切加载的作业关系。

最新更新