php - 如何在 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);
});
}
}
解决方案
我唯一要重构的是你如何检查公司关系是否存在。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();
}
推荐阅读
- c# - 使用多重绑定设置 c# wpf 组合框背景颜色
- html - 如何在 CSS 和 HTML 中复制此页脚?
- oracle-cloud-infrastructure - 在 Oracle Cloud 中打开特定端口 - Ubuntu 18
- bash - 用户如何在bash中传递数组的特定索引中的值
- postgresql - DBevear 不显示详细的数据库视图
- vb.net - *.Designer.vb 中的属性更改未更新
- ubuntu - 使用 iconv 命令将 UTF-8 (US-ASCII) 转换为 ISO8859-1
- r - R 中的 %...!% 和 %...>% 有什么区别?
- tensorflow - 在多类分类中从 tensorflow 2.3.1 降级到 tensorflow 1.14 或 1.15 时,过拟合会降低准确度性能
- javascript - 如何从布局页面为 JWT 令牌定义全局变量以在任何需要身份验证的页面中可用?