Laravel whereIn issue with Ajax 多选复选框
Laravel whereIn issue with Ajax multiselect checkbox
我有一个多 select 复选框,我用它来识别复选框并使用 AJAX Get 将这些值传递给 Laravel 控制器。
当我将 Ajax 数据传递给控制器时,json 只返回一个 collection.To 具体来说,它只返回传递的字符串中的第一个值。所以如果我在复选框中 select 1,2,4,8。它正在返回 category_id = 1 的项目。如果我 select 2,9,10 它只返回 category_id = 2 的项目。为了检查输入是否正确,我将输入传递给查看,也传递给 console.log,它总是说输入正确。
我可以检索所有项目,但是当我使用 whereIn 并传递数据时,它只会获取传递数组中第一个值的集合。
我试过把它做成数组并通过:
1) 将 ajax 数据传递给数组,然后使用 implode 将其转换为字符串,并将其以数组形式传递给 whereIn
2) 直接将数组传递给 whereIn
我还附上了几个我尝试失败的查询。
任何建议都会有很大的帮助。
项目控制器
public function getPaginate(Request $request) {
$input = array(Input::get('categories'));
//$input2 = array($input);
//$value = implode(',', $input);
$sql = [1,2];
$projects = \App\Project::whereIn('category_id' , $sql)->get(); //working
//$projects = DB::table('projects')->whereIn('category_id', array($value))->get();
//$projects = DB::select("select * from categories INNER JOIN projects on categories.id = projects.category_id where category_id IN('$value')" );
//$projects = \App\Project::paginate(4);
$categories = \App\Category::all();
// $projects = DB::select('select * from categories INNER JOIN projects on categories.id = projects.category_id where category_id IN('.$products.')' );
// changed for AJAX
if(Request::ajax()) {
$projects = \App\Project::whereIn('category_id' ,$input)->get(); //not working
//$value = implode(',', $input);
//return Response::json(View::make('layouts.projects',array('projects'=>$input))->render());
return Response::json(array('projects' =>$projects,'input'=>$input));
}
return view('paginate', ['projects' =>$projects,'categories'=>$categories]);
}
Ajax & Jquery 选择器
$(document).ready(function() {
$('input[type="checkbox"]').on('change', function(event) {
var checkboxValues = [];
$('input[type="checkbox"]:checked').each(function(index, elem) {
checkboxValues.push($(elem).val());
});
$('#myResponse').html(checkboxValues.join(','));
categories = checkboxValues.join(',');
getfilters();
});
});
var getfilters = function () {
$.ajax({
type: 'GET',
headers: {
'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
},
url: '{{URL::route('get.paginate')}}',
data: {categories: categories},
error: function(e) {
console.log(e.responseText);
},
success: function (data) {
console.log(data);
$('#projects').html(data);
}});
};
- 调用
.get()
将生成的jQuery对象变成真正的数组。
- 使用内置的
Array.toString
方法。
- 最好使用
POST
而不是 GET
。
- 将
array(Input::get('categories'))
更改为 Input::get('categories')
。
var categories;
var getfilters = function () {
$.ajax({
type: 'POST',
headers: {
'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
},
url: '',
data: {categories: categories},
error: function(e) {
console.log(e.responseText);
},
success: function (data) {
console.log(data);
$('#projects').html(data);
}});
};
$(':checkbox').on('change', function(event) {
event.preventDefault();
categories = $("input:checkbox:checked").map(function(){
return $(this).val();
}).get(); // <----
$('#myResponse').html(categories.toString()); // <---- 'one,two,three;
getfilters();
});
我有一个多 select 复选框,我用它来识别复选框并使用 AJAX Get 将这些值传递给 Laravel 控制器。
当我将 Ajax 数据传递给控制器时,json 只返回一个 collection.To 具体来说,它只返回传递的字符串中的第一个值。所以如果我在复选框中 select 1,2,4,8。它正在返回 category_id = 1 的项目。如果我 select 2,9,10 它只返回 category_id = 2 的项目。为了检查输入是否正确,我将输入传递给查看,也传递给 console.log,它总是说输入正确。
我可以检索所有项目,但是当我使用 whereIn 并传递数据时,它只会获取传递数组中第一个值的集合。
我试过把它做成数组并通过: 1) 将 ajax 数据传递给数组,然后使用 implode 将其转换为字符串,并将其以数组形式传递给 whereIn 2) 直接将数组传递给 whereIn
我还附上了几个我尝试失败的查询。
任何建议都会有很大的帮助。
项目控制器
public function getPaginate(Request $request) {
$input = array(Input::get('categories'));
//$input2 = array($input);
//$value = implode(',', $input);
$sql = [1,2];
$projects = \App\Project::whereIn('category_id' , $sql)->get(); //working
//$projects = DB::table('projects')->whereIn('category_id', array($value))->get();
//$projects = DB::select("select * from categories INNER JOIN projects on categories.id = projects.category_id where category_id IN('$value')" );
//$projects = \App\Project::paginate(4);
$categories = \App\Category::all();
// $projects = DB::select('select * from categories INNER JOIN projects on categories.id = projects.category_id where category_id IN('.$products.')' );
// changed for AJAX
if(Request::ajax()) {
$projects = \App\Project::whereIn('category_id' ,$input)->get(); //not working
//$value = implode(',', $input);
//return Response::json(View::make('layouts.projects',array('projects'=>$input))->render());
return Response::json(array('projects' =>$projects,'input'=>$input));
}
return view('paginate', ['projects' =>$projects,'categories'=>$categories]);
}
Ajax & Jquery 选择器
$(document).ready(function() {
$('input[type="checkbox"]').on('change', function(event) {
var checkboxValues = [];
$('input[type="checkbox"]:checked').each(function(index, elem) {
checkboxValues.push($(elem).val());
});
$('#myResponse').html(checkboxValues.join(','));
categories = checkboxValues.join(',');
getfilters();
});
});
var getfilters = function () {
$.ajax({
type: 'GET',
headers: {
'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
},
url: '{{URL::route('get.paginate')}}',
data: {categories: categories},
error: function(e) {
console.log(e.responseText);
},
success: function (data) {
console.log(data);
$('#projects').html(data);
}});
};
- 调用
.get()
将生成的jQuery对象变成真正的数组。 - 使用内置的
Array.toString
方法。 - 最好使用
POST
而不是GET
。 - 将
array(Input::get('categories'))
更改为Input::get('categories')
。
var categories;
var getfilters = function () {
$.ajax({
type: 'POST',
headers: {
'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
},
url: '',
data: {categories: categories},
error: function(e) {
console.log(e.responseText);
},
success: function (data) {
console.log(data);
$('#projects').html(data);
}});
};
$(':checkbox').on('change', function(event) {
event.preventDefault();
categories = $("input:checkbox:checked").map(function(){
return $(this).val();
}).get(); // <----
$('#myResponse').html(categories.toString()); // <---- 'one,two,three;
getfilters();
});