在 Laravel 多对多关系中编写更好的代码

问题描述 投票:0回答:1

嗨,我编写了这段代码,它工作得很好,但我认为这不是最好的方法!

我想获得 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;

任何人都可以帮我将其更改为更好的代码吗

提前谢谢你

php laravel many-to-many laravel-8 relationship
1个回答
0
投票

您执行相反的操作并从 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
来过滤作业结果(您可以通过使用字段
company_id
来使其更快)地址表) 第二个是使用预先加载的工作关系。

© www.soinside.com 2019 - 2024. All rights reserved.