Мне нужно оптимизировать следующий запрос, так как в результирующем запросе 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']);
},
Могу ли я что-нибудь еще сделать, чтобы оптимизировать это?