Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/274.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php Laravel SQL查询,其中+;其中+;或者在哪里_Php_Mysql_Laravel_Query Builder - Fatal编程技术网

Php Laravel SQL查询,其中+;其中+;或者在哪里

Php Laravel SQL查询,其中+;其中+;或者在哪里,php,mysql,laravel,query-builder,Php,Mysql,Laravel,Query Builder,我在这个问题上遇到了一些问题,我没有主意,让我解释一下: 以下是我所拥有的: 用户表(与此问题相关的列:名称、说明) 服务表(与此问题相关的列:名称、描述、子类别\u id、类别\u id) 用户服务关系的透视表 以下是我希望发生的事情: 应用程序必须能够通过文本搜索用户及其相关服务的名称/描述 此外,该应用程序可以为搜索发送一个类别id和多个子类别id,因此相关服务必须具有该id 第一次搜索效果不错,当我尝试第二次搜索时,问题就来了。就像它没有考虑查询的每个参数一样。我希望它只在类别i

我在这个问题上遇到了一些问题,我没有主意,让我解释一下:

以下是我所拥有的:

  • 用户表(与此问题相关的列:名称、说明)
  • 服务表(与此问题相关的列:名称、描述、子类别\u id、类别\u id)
  • 用户服务关系的透视表
以下是我希望发生的事情:

  • 应用程序必须能够通过文本搜索用户及其相关服务的名称/描述
  • 此外,该应用程序可以为搜索发送一个类别id和多个子类别id,因此相关服务必须具有该id
第一次搜索效果不错,当我尝试第二次搜索时,问题就来了。就像它没有考虑查询的每个参数一样。我希望它只在类别id或子类别id匹配时按文本搜索,但它显示的结果没有匹配项

以下是我到目前为止得到的信息:

        $professionals = \DB::table('users')->where('role_id', Role::PROFESSIONAL_USER)
                            ->join('professional_service', 'users.id', '=', 'professional_service.user_id', 'left')
                            ->join('services', 'services.id', '=', 'professional_service.service_id', 'left')
                            ->select('users.id', 'users.name as name', 'users.last_name as last_name', 'users.gender as gender', 'users.description as description', 'users.city', 'users.latitude', 'users.longitude', 'users.wpicture')
                            ->where('users.name', 'like', '%'.$request->search.'%')
                            ->where('services.category_id', '=', $request->category_id)
                            ->orWhere('users.description', 'like', '%'.$request->search.'%')
                            ->orWhere('services.name', 'like', '%'.$request->search.'%')
                            ->orWhere('services.description', 'like', '%'.$request->search.'%')
                            ->whereIn('services.subcategory_id', $request->subcategories)
                            ->groupBy('users.id')
                            ->paginate($request->per_page);
任何帮助都将不胜感激。谢谢

编辑(使用注释中建议的闭包):

现在的问题是,如果用户只按文本搜索,并且类别/子类别为空,则不会显示任何结果。如果它们为空,我怎么能忽略它们呢?

找到了解决方案(我相信可以用更好的方法来完成,但这对我来说很有用):


感谢关于闭包的提示。

如果您发布了完整的原始MySQL查询,您正试图使用Laravel语法对其进行建模,这可能会帮助您提出问题。请在查询中使用闭包。您需要设置一些特定的条件处理顺序,但您的普通where或where不提供您需要的顺序,并且使用常规(因此,首先对所有和进行求值,然后对或进行求值)。您必须使用提供逻辑所需的表达式处理顺序的。由于此注释取得了一些进展,将编辑我的问题,因为我遇到了另一个问题
        $professionals = \DB::table('users')->where('role_id', Role::PROFESSIONAL_USER)
                            ->join('professional_service', 'users.id', '=', 'professional_service.user_id', 'left')
                            ->join('services', 'services.id', '=', 'professional_service.service_id', 'left')
                            ->select('users.id', 'users.name as name', 'users.last_name as last_name', 'users.gender as gender', 'users.description as description', 'users.city', 'users.latitude', 'users.longitude')
                            ->where(function($query) use ($search){ $query->where('users.name', 'like', '%'.$search.'%'); $query->orWhere('users.description', 'like', '%'.$search.'%'); $query->orWhere('services.name', 'like', '%'.$search.'%'); $query->orWhere('services.description', 'like', '%'.$search.'%');})
                            ->where('services.category_id', '=', $request->category)
                            ->whereIn('services.subcategory_id', explode(',', $request->subcategories))
                            ->groupBy('users.id')
                            ->paginate($request->per_page);
        $professionals = \DB::table('users')->where('role_id', Role::PROFESSIONAL_USER)
                            ->join('professional_service', 'users.id', '=', 'professional_service.user_id', 'left')
                            ->join('services', 'services.id', '=', 'professional_service.service_id', 'left')
                            ->select('users.id', 'users.name as name', 'users.last_name as last_name', 'users.gender as gender', 'users.description as description', 'users.city', 'users.latitude', 'users.longitude')
                            ->where(function($query) use ($search){ $query->where('users.name', 'like', '%'.$search.'%'); $query->orWhere('users.description', 'like', '%'.$search.'%'); $query->orWhere('services.name', 'like', '%'.$search.'%'); $query->orWhere('services.description', 'like', '%'.$search.'%');})
                            ->when($category, function($query) use ($category) { $query->where('services.category_id', '=', $category);})
                            ->when($subcategories, function($query) use ($subcategories) { $query->whereIn('services.subcategory_id', $subcategories);})
                            ->groupBy('users.id')
                            ->paginate($request->per_page);