Php 将筛选器附加到laravel中集合的sql结果

Php 将筛选器附加到laravel中集合的sql结果,php,sql,laravel,Php,Sql,Laravel,因此,使用纯PHP和MySQL,我可以过滤一个查询$sql=从用户中选择*;然后我有下拉列表,国家省和地区 如果用户未选择任何内容,请单击“获取报告”以显示所有用户。如果用户从下拉列表中选择任何选项,例如国家,则应根据所选国家缩小结果范围。用户还可以在所有下拉列表上实现相同的功能 因此,我正试图用Laravel将其存档,我将向您展示我的代码 我已经选择并加入了表,并将其带回我的结果。如果设置了dropdwon值,我会尝试在结果中添加一个where,但它不会像我预期的那样给我结果 $results

因此,使用纯PHP和MySQL,我可以过滤一个查询$sql=从用户中选择*;然后我有下拉列表,国家省和地区

如果用户未选择任何内容,请单击“获取报告”以显示所有用户。如果用户从下拉列表中选择任何选项,例如国家,则应根据所选国家缩小结果范围。用户还可以在所有下拉列表上实现相同的功能

因此,我正试图用Laravel将其存档,我将向您展示我的代码

我已经选择并加入了表,并将其带回我的结果。如果设置了dropdwon值,我会尝试在结果中添加一个where,但它不会像我预期的那样给我结果

$results = DB::table('people')
            ->leftJoin('contacts', 'people.id', '=', 'contacts.person_id')
            ->leftJoin('provinces', 'contacts.province_id', '=', 'provinces.id')
            ->leftJoin('nationalities', 'people.nationality_id', '=', 'nationalities.id')
            ->leftJoin('districts', 'contacts.district_id', '=', 'districts.id')
            ->select('people.*', 'contacts.*', 'provinces.name AS province_name',
                'nationalities.name AS nationality', 'districts.name AS district_name');

        if (request()->has('nationality_id')) {
            $nationality_id = request('nationality_id');
            $results->where('people.nationality', '=', $nationality_id)->get();
        }

        return view('reports.index', compact('results', 'nationalities', 'provinces'));

我希望如果我选择dropdown并喜欢province,它会用所选的province值过滤集合。

试试这个,也许它会对你有所帮助

if (request()->has('nationality_id')) {
   $nationality_id = request('nationality_id');
   $results = DB::table('people')
        ->leftJoin('contacts', 'people.id', '=', 'contacts.person_id')
        ->leftJoin('provinces', 'contacts.province_id', '=', 'provinces.id')
        ->leftJoin('nationalities', 'people.nationality_id', '=', 'nationalities.id')
        ->leftJoin('districts', 'contacts.district_id', '=', 'districts.id')
        ->select('people.*', 'contacts.*', 'provinces.name AS province_name',
            'nationalities.name AS nationality', 'districts.name AS district_name')
        ->where('people.nationality', '=', $nationality_id)->get();
}else{
  $results = DB::table('people')
        ->leftJoin('contacts', 'people.id', '=', 'contacts.person_id')
        ->leftJoin('provinces', 'contacts.province_id', '=', 'provinces.id')
        ->leftJoin('nationalities', 'people.nationality_id', '=', 'nationalities.id')
        ->leftJoin('districts', 'contacts.district_id', '=', 'districts.id')
        ->select('people.*', 'contacts.*', 'provinces.name AS province_name',
            'nationalities.name AS nationality', 'districts.name AS district_name')
        ->get();
}

您应该重写
$results
变量:

//...
if (request()->has('nationality_id')) {
    $nationality_id = request('nationality_id');
    $results = $results->where('people.nationality', '=', $nationality_id)->get();
}
//...

这条线有问题

$results->where('people.nationality', '=', $nationality_id)->get();
->get()方法在new
Collection
对象中返回,您需要将其传递给另一个变量

$results
itslef是一个
Builder
实例

换衣服

 $results->where('people.nationality', '=', $nationality_id)->get();


您将得到您想要的。

您应该编辑以下代码:

 if (request()->has('nationality_id')) {
            $nationality_id = request('nationality_id');
            $results =   $results->where('people.nationality', '=', $nationality_id)->get();
        }
为此:

if ($nationality_id = request('nationality_id')) {
        $results = $results->where('people.nationality', '=', $nationality_id);
    }

$results = $results->get()

我希望有三个下拉列表,其中一个可以选择国籍单独或国籍和省一起,或只是省单独,但仍然过滤结果。您应该根据用户输入构建您的请求。每次从下拉列表中检测到某个值时,添加新的
where
条件。如果您的国籍正确,只需为其他下拉列表添加其他条件,但不要忘记重写
$results
if ($nationality_id = request('nationality_id')) {
        $results = $results->where('people.nationality', '=', $nationality_id);
    }

$results = $results->get()