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