如何修复这个雄辩的数据库查询

时间:2014-01-02 02:59:12

标签: laravel laravel-4 eloquent

以下代码需要大量返工。我想干一些东西,只添加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.');
    }
}

1 个答案:

答案 0 :(得分:0)

我要做的第一件事就是在User模型上创建一个scopeSearch方法,让您只需在任何地方调用$query->search($searchFor) - 这样可以为您节省大量代码。阅读范围方法here。如果您愿意,也可以进行排序。

我要做的第二件事,但这只是我的意见,是通过使存储库为fluent interface来实现搜索,排序,分页等作为可链接的方法。我发现了一个很好的SO答案here,深入解释了如何在PHP中建立一个流畅的界面。

您不必实现流畅的界面,但我发现它有利于实现DRY,而使用搜索术语,过滤器和排序参数传递大数据(甚至是对象)数据的替代方法很快就会变得混乱。