首页 > 解决方案 > 用户列表过滤,返回空对象

问题描述

我有两个 list-filtering inputs,如果单独使用它们可以完美地工作,但是当一起使用时它会返回一个空对象。

过滤器包含一个简单的搜索Input字段和一个select.

它们触发对服务器的 API 调用,使用时两者看起来像这样

http://127.0.0.1:8000/api/user?&search=jom&type=admin

这个method调用触发器看起来像这样

public function index(Request $request) {
        $search = $request->input('search');
        $type = $request->input('type');

        $user = User::select('*');

        $this->checkSearch($user, $search); // check for search
        $this->filterUserType($user, $type); // filter user type
...

method checkSearch看起来像这样

    private function checkSearch(&$query, $search) {

        if (!isset($query)) {
            return $query;
        }

        if (!is_null($search)) {
            $searchTerms = $this->stringToArray($search, ' ');

            $query = $query->where(function ($query) use ($searchTerms) {
                for ($i = 0, $max = count($searchTerms); $i < $max; $i++) {
                    $term = str_replace('_', '\_', mb_strtolower('%' . $searchTerms[$i] . '%'));
                    $query->whereRaw("(Lower(name) LIKE ?)", [$term, $term])
                        ->orWhereRaw("(Lower(bio) LIKE ?)", [$term, $term]);
                }
            });
        }
    }

filterUserType这样的

    private function filterUserType(&$query, $type) {
        if (!isset($query)) { return $query; }

        if (!is_null($type)) {
            $query = $query->where( 'type', $type);
        }
    }

我试图检查where方法filterUserTypeorWhere但这只是返回两个未组合的值。

标签: mysqllaravel

解决方案


我触发了原始查询的中断,它看起来像这样

select *  from `users` where ((Lower(name) LIKE %jom%) or (Lower(bio) LIKE %jom%)) and `type` = %jom%)

当我切换方法时,我得到了正确的结果。切换自

 $this->checkSearch($user, $search); // check for search
 $this->filterUserType($user, $type); // filter user type

 $this->filterUserType($user, $type); // filter user type
 $this->checkSearch($user, $search); // check for search

仍然不知道为什么,但它工作


推荐阅读