Как я могу изменить свой код в laravel OOP - PullRequest
0 голосов
/ 12 апреля 2020

Мой код не читается и его трудно масштабировать.

<?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) {
                foreach($company_ids as $id) {
                    $query->oRwhere('company_id',$id);
                }

            })->get();
    }
}

Мне нужно получить все категории, связанные с компаниями и пользователями. BlogCategory связал многих со многими с User BlogCategory связал многих со многими с компанией

Извините за мой engli sh, спасибо.


сейчас

<?php
namespace App\Services;

use App\Models\Company;
use App\Models\BlogCategory;
use Illuminate\Database\Eloquent\Collection;


Class BlogServices
{
    public function getCategoriesByUserAndCompany(int $user_id, array $company_ids): Collection
    {
        $company = $this->getCategoriesByCompany($company_ids);

        return $this->getCategoriesByUser($user_id)->union($company)->get();
    }

    public function getCategoriesByUser(int $user_id)
    {
        return BlogCategory::whereHas('user', function ($query) use ($user_id) {
            $query->where('user_id',$user_id);
        });
    }

    public function getCategoriesByCompany(array $company_ids)
    {
        return BlogCategory::whereHas('company', function ($query) use ($company_ids) {
                $query->whereIn('company_id', $company_ids);
            });       
    }
}

1 Ответ

1 голос
/ 12 апреля 2020

Единственное, что я хотел бы рефакторинг, это как вы проверяете, существует ли отношение компании. 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();
}
...