在 laravel 多对多关系中编写更好的代码
make better code in laravel many to many relation
嗨,我写了这段代码,它工作得很好,但我认为这不是最好的方法!
我想获得 1 个公司的所有职位。
每个公司可以有多个地址,每个地址可以有多个职位
这是我的代码:
$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
.
中
我给你的例子 运行s 只有两个查询,第一个 (job_details) 将使用连接来过滤公司 id
的工作结果 table(您可以使用地址 table 中的字段 company_id
使其更快)
第二个是使用预加载的工作关系。
嗨,我写了这段代码,它工作得很好,但我认为这不是最好的方法!
我想获得 1 个公司的所有职位。
每个公司可以有多个地址,每个地址可以有多个职位
这是我的代码:
$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
.
我给你的例子 运行s 只有两个查询,第一个 (job_details) 将使用连接来过滤公司 id
的工作结果 table(您可以使用地址 table 中的字段 company_id
使其更快)
第二个是使用预加载的工作关系。