首页 > 解决方案 > 如何在 laravel OOP 中重构我的代码

问题描述

我的代码不可读且难以扩展。

<?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 与用户多对多相关 BlogCategory 与公司多对多相关

对不起我的英语,谢谢。


现在

<?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);
            });       
    }
}

标签: phplaravellaravel-5refactoring

解决方案


我唯一要重构的是你如何检查公司关系是否存在。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();
    }
}

这应该是获得相同结果的最干净的方法。我觉得它非常整洁。

以下是有关如何根据用户输入过滤查询的更新:

不要为您可以添加到查询的每个可能的过滤器创建一个函数,而是尝试根据用户请求链接您的查询。

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();
}

推荐阅读