Оптимизируйте запрос, построенный с использованием Laravel Eloquent - PullRequest
0 голосов
/ 14 июля 2020

Мне нужно оптимизировать следующий запрос, так как в результирующем запросе ajax заканчивается память.

$types = $request->get('types', null);

        return [
            'results' => Client::with([
                'people' => function ($query) use ($request) {
                    $query
                        ->when(! $request->has('withDeceased'), function (Builder $query) {
                            $query->notDeceased();
                        })
                        ->select(['people.id', 'preferred_name', 'full_name', 'home_postcode']);
                },
                'type',
            ])
                ->when(! empty($request->term), function (Builder $query) use ($request) {
                    $query->whereHas('people', function (Builder $query) use ($request) {
                        $query
                            ->where('full_name', 'ilike', '%' . $request->term . '%')
                            ->orWhere('preferred_name', 'ilike', '%' . $request->term . '%');
                    })
                        ->orWhere(function (Builder $query) use ($request) {
                            $query->where('name', 'ilike', '%' . $request->term . '%')
                                ->orWhere('trading_name', 'ilike', '%' . $request->term . '%')
                                ->orWhere('company_number', 'ilike', '%' . $request->term . '%');
                        });
                })
                ->filterByType($types)
                ->orderBy('name')
                ->get()
                ->map(function ($client) use ($request) {
                    if ($client->type->slug == 'personal') {
                        $postcode = $client->people->map->home_postcode->filter()->first();
                        $text = $client->people->map->full_name->implode(' & ') . ($postcode ? ' - ' . $postcode : '');
                    } else {
                        $text = $client->name;
                    }

                    $clientArr = [
                        'id' => $client->id,
                        'text' => $text,
                    ];
                    $request->has('withPeople') ? $clientArr['people'] = $client->people : null;

                    return $clientArr;
                }),
        ];

Мне нужно оптимизировать, запрашивая только соответствующие данные, которые необходимы для возврата этих результатов.

Единственный способ, как я могу это оптимизировать, - это изменить type, на:

'type' => function (BelongsTo $query) {
   $query->select(['client_types.id', 'name', 'slug']);
},

Могу ли я что-нибудь еще сделать, чтобы оптимизировать это?

...