以下代码需要大量返工。我想干一些东西,只添加paginate并排序,如果它在选项中设置。你有什么建议来解决这个问题吗?
我尝试过手动分页,但它会返回一个数组而不是一个对象,所以我的索引页会中断。
UserController中:
// Search term
$src = Request::get('src');
$sort_by = Request::get('sort_by');
$sort_type = Request::get('sort');
$limit = Request::get('limit');
$users = $this->users->search(['email','username','status'], $src, ['paginate' => ['limit' => 5], 'sort' => ['by' => $sort_by, 'type' => $sort_type]]);
UserRepository:
public function search($fields, $search_term, $options = array())
{
$users = NULL;
if (is_array($fields))
{
// Check if the user wants to paginate it
if (isset($options['paginate']))
{
$this->pagination_limit = $options['paginate']['limit'];
$users = User::orWhere(function($query) use ($fields, $search_term) {
foreach($fields as $field)
{
$query->orWhere($field, 'LIKE', "%$search_term%");
}
})->paginate($this->pagination_limit);
}
// Return un-paginated result
else
{
$users = User::orWhere(function($query) use ($fields, $search_term) {
foreach($fields as $field)
{
$query->orWhere($field, 'LIKE', "%$search_term%");
}
})->get();
}
}
else
{
throw new \Exception('Fields must be an in the form of array.');
}
}
答案 0 :(得分:0)
我要做的第一件事就是在User模型上创建一个scopeSearch
方法,让您只需在任何地方调用$query->search($searchFor)
- 这样可以为您节省大量代码。阅读范围方法here。如果您愿意,也可以进行排序。
我要做的第二件事,但这只是我的意见,是通过使存储库为fluent interface来实现搜索,排序,分页等作为可链接的方法。我发现了一个很好的SO答案here,深入解释了如何在PHP中建立一个流畅的界面。
您不必实现流畅的界面,但我发现它有利于实现DRY,而使用搜索术语,过滤器和排序参数传递大数据(甚至是对象)数据的替代方法很快就会变得混乱。