代码重构 - 改进重复的查询生成器调用以提高可读性
Code Refactoring - Improve Duplicated Query Builder Calls for Readability
所以我在我的模型的许多部分都重复了相同的代码,但是在不同的函数中。这是一个例子:
$records = AuditLogEntry::whereIn('context_type', ['Type1', 'Type2'])
->whereContextId($this->id)
->whereIn('event_type', [config('constants.audit_log.EVENT_TYPE_UPDATE'),
config('constants.audit_log.EVENT_TYPE_CANCEL')])
->whereDate('created_at', '>', $date)
->select(['id', 'meta', 'event_type'])
->orderByDesc('created_at')
->get();
在另一个做其他事情的函数中,我也有类似的代码块(注意最后 4 行代码):
$records2 = AuditLogEntry::whereContextType('Type3')
->whereEventType(config('constants.audit_log.EVENT_TYPE_EXERCISE'))
->whereIn('context_id', $contexts->toArray())
->whereDate('created_at', '>', $date)
->select(['meta', 'event_type'])
->orderByDesc('created_at')
->get();
所以我的想法只是对这些行进行简单的代码重构:
->whereDate('created_at', '>', $date)
->select(['meta', 'event_type'])
->orderByDesc('created_at')
->get();
因为我的模型中很多地方都需要它们,所以我尝试使用回调来执行此代码重构,如下所示:
private function recordsQuery(string $date): Closure
{
return function ($query) use ($date) {
$query->whereDate('created_at', '>', $date)
->select(['meta', 'event_type'])
->orderByDesc('created_at')
->get();
};
}
那么我就可以去掉这 4 行代码,得到这样的东西:
$exercises = AuditLogEntry::whereContextType('Exercise')
->whereEventType(config('constants.audit_log.EVENT_TYPE_EXERCISE'))
->whereIn('context_id', $grantsExercised->pluck('id')->toArray())
->$this->recordsQuery(); /** This is not working, obviously but you guys can get the idea of what I'm trying to do */
所以问题是我想使用链接来提高可读性,我在想是否可以使用宏并扩展查询生成器,包括这个新功能。当然,我想听听大家的意见,看看有没有人有更好的主意。
谢谢你们的帮助:)
您可以创建一个查询范围来实现这一点:https://laravel.com/docs/7.x/eloquent#local-scopes
所以我在我的模型的许多部分都重复了相同的代码,但是在不同的函数中。这是一个例子:
$records = AuditLogEntry::whereIn('context_type', ['Type1', 'Type2'])
->whereContextId($this->id)
->whereIn('event_type', [config('constants.audit_log.EVENT_TYPE_UPDATE'),
config('constants.audit_log.EVENT_TYPE_CANCEL')])
->whereDate('created_at', '>', $date)
->select(['id', 'meta', 'event_type'])
->orderByDesc('created_at')
->get();
在另一个做其他事情的函数中,我也有类似的代码块(注意最后 4 行代码):
$records2 = AuditLogEntry::whereContextType('Type3')
->whereEventType(config('constants.audit_log.EVENT_TYPE_EXERCISE'))
->whereIn('context_id', $contexts->toArray())
->whereDate('created_at', '>', $date)
->select(['meta', 'event_type'])
->orderByDesc('created_at')
->get();
所以我的想法只是对这些行进行简单的代码重构:
->whereDate('created_at', '>', $date)
->select(['meta', 'event_type'])
->orderByDesc('created_at')
->get();
因为我的模型中很多地方都需要它们,所以我尝试使用回调来执行此代码重构,如下所示:
private function recordsQuery(string $date): Closure
{
return function ($query) use ($date) {
$query->whereDate('created_at', '>', $date)
->select(['meta', 'event_type'])
->orderByDesc('created_at')
->get();
};
}
那么我就可以去掉这 4 行代码,得到这样的东西:
$exercises = AuditLogEntry::whereContextType('Exercise')
->whereEventType(config('constants.audit_log.EVENT_TYPE_EXERCISE'))
->whereIn('context_id', $grantsExercised->pluck('id')->toArray())
->$this->recordsQuery(); /** This is not working, obviously but you guys can get the idea of what I'm trying to do */
所以问题是我想使用链接来提高可读性,我在想是否可以使用宏并扩展查询生成器,包括这个新功能。当然,我想听听大家的意见,看看有没有人有更好的主意。
谢谢你们的帮助:)
您可以创建一个查询范围来实现这一点:https://laravel.com/docs/7.x/eloquent#local-scopes