Единственное, что я хотел бы рефакторинг, это как вы проверяете, существует ли отношение компании. Laravel имеет метод с именем whereIn()
, вы можете использовать его вместо циклического перебора вашего $company_ids
.
<?php
namespace App\Services;
use App\Models\BlogCategory;
use Illuminate\Database\Eloquent\Collection;
Class BlogServices
{
public function getCategoriesByUserAndCompany(int $user_id, array $company_ids): Collection
{
return BlogCategory::whereHas('user', function ($query) use ($user_id) {
$query->where('user_id',$user_id);
})->orWhereHas('company', function ($query) use ($company_ids) {
$query->whereIn('company_id', $company_ids);
})->get();
}
}
Это должен быть самый чистый способ получить те же результаты. Я нахожу это очень опрятным. 100
Вот обновление о том, как вы можете фильтровать свой запрос на основе пользовательского ввода:
Вместо создания функции для каждого возможного фильтра, который вы можете добавить к запросу попробуйте создать цепочку для вашего запроса на основе запроса пользователя.
public function getCategories(Request $request): Collection
{
$categories = BlogCategory::query(); //Initialaze query on BlogCategory
// Check if user requested categories to be filtered by user.
$user_id = $request->get('user_id', false);
if($user_id) {
$categories->whereHas('user', function ($query) use ($user_id) {
$query->where('user_id',$user_id);
});
}
// Check if user requested for categories to be filtered by companies.
$company_ids = $request->query('company_ids', false);
if ($company_ids) {
$categories->whereHas('company', function ($query) use ($company_ids) {
$query->whereIn('company_id', $company_ids);
});
}
return $categories->get();
}