如何使用AJAX将数据传递给Laravel中的控制器?
我真的被Laravel中的AJAX请求/响应所困扰,如果有人能帮助我,我将非常高兴 这是我的JS Ajax:如何使用AJAX将数据传递给Laravel中的控制器?,ajax,laravel,Ajax,Laravel,我真的被Laravel中的AJAX请求/响应所困扰,如果有人能帮助我,我将非常高兴 这是我的JS Ajax: $('#manufacturer_id').change(function(){ var manuf_id = $(this).val(); console.log("1:"+manuf_id); var dataString = '{manufacturer_id:'+ manuf_id+'}'; console.log("2:"+dataString); //
$('#manufacturer_id').change(function(){
var manuf_id = $(this).val();
console.log("1:"+manuf_id);
var dataString = '{manufacturer_id:'+ manuf_id+'}';
console.log("2:"+dataString);
// Ajax
$.ajax({
url: "/laravel/public/posts/create",
type: 'GET',
data: dataString,
cache: false,
success: function(data) {
console.log(dataString);
},
});
});
这是PostsController,我只需要更改一个ID:
public function create(Request $manuf_id)
{
$title = 'Add post';
$categories = Category::all();
$manufacturers = Manufacturer::all();
$fuels = Fuel::all();
$sendedID = \Response::json($manuf_id);
$cars = Car::where('manufacturer_id', $sendedID)->get();
return view('posts.create',
compact(
'title',
'categories',
'fuels',
'cars',
'manufacturers'
)
);
}
我真正想要实现的是:当用户在我的表单中从选择框中选择制造商时,制造商的ID将更改此处写入的ID:
$cars = Car::where('manufacturer_id', $sendedID)->get();
基本上,当我硬编码数字(ID)而不是变量$sendedID时,我得到了我所需要的一切(我的数据库中的表之间已经有了关联)
我所需要做的就是发送manufacturer的值(onchange)并将其传递给PostsController中的变量$sendedID。我可能需要更改我的PostController中的代码,只是不知道如何更改,我已经做了很多研究,但找不到答案。感谢任何知道如何修复此问题的人。在您的JS中,您试图创建一个JSON字符串以发送到服务器。没有必要这样做,因为jQuery将为您转换所有内容,所以只需发送一个带有所需参数的普通Javascript对象 这也意味着您可以清理服务器代码,因为您不再需要尝试解码发送的数据 对于您的JS:
$('#manufacturer_id').change(function(){
$.ajax({
url: "/laravel/public/posts/create",
type: 'GET',
data: { manufacturer_id: $(this).val() },
cache: false,
success: function(data) {
console.log(dataString);
},
});
});
然后在控制器中:
public function create(Request $manuf_id)
{
$title = 'Add post';
$categories = Category::all();
$manufacturers = Manufacturer::all();
$fuels = Fuel::all();
$cars = Car::where('manufacturer_id', request('manufacturer_id'))->get();
return view('posts.create',
compact(
'title',
'categories',
'fuels',
'cars',
'manufacturers'
)
);
}
据我所知,你需要的是: 这里有一个所有
制造商的下拉列表
。当用户选择一个时,车辆的选项也将更改
如果您想通过ajax实现这一点,您必须创建一个单独的方法来返回特定制造商的所有汽车
。比方说
public function getCars(Request $request) {
$cars = Car::where("manufacturer_id", $request->get("manufacturer_id"))->get();
return response()->json($cars);
}
那么ajax方法应该能够检索这些数据
$('#manufacturer_id').change(function() {
$.ajax({
url: GET_CARS_URL,
type: 'GET',
data: { manufacturer_id: $(this).val() },
cache: false,
success: function(data) {
console.log(data);
},
});
});
首先,您必须附加X-CSRF-TOKEN以通过AJAX请求发送数据。在发送ajax请求之前,先检查javascript变量是否收到数据,然后在控制器dd()中,ajax成功发送数据请求
检查通过post发送数据的路线是否正常。您可以在控制台中使用php artisan route:list代码检查所有已注册的路由
如何在ajax正文中附加X-CSRF-TOKEN
$.ajaxSetup({
headers: {
'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
}
});
$.ajax({
url: '/laravel/public/posts/create',
type: "post",
data: 'id=' + id ,
success: function (res) {
//response
}
});
然后检查控制器是否正确接收数据。如果是请求对象,则可以使用$request->id访问id
Public function create(Request $request){
dd($request); // this will show data receive from request
$id = $request->id // access request object id
}
谢谢,但这对我不起作用。当我在success函数中使用alert(data)时,现在我得到了当前页面的完整HTML代码,而不仅仅是一个带有整数manufacturer_id的字符串。而且汽车型号的下拉列表不会根据manufacturer_id而改变。当然,你会得到完整的HTML,因为这是你的create方法返回的结果。是的,但是如何在页面上为用户显示这些数据呢?我在这里有点困惑,因为与Ajax和Laravel一起工作对我来说仍然是一个新领域。如果你想这样做,你必须刷新页面,而不是使用Ajax。谢谢你,但当我尝试这样做时,变量车是未定义的,我在尝试循环时出错。在我看来,我仍然看不到回应,我有点做不到/您可以使用returnresponse()->json(compact('cars')代码>路由列表向我显示posts.create使用GET方法,这应该可以,因为此页面用于表单。此表单的发送被重新分配到posts.store,但我仍然无法从ajax接收到视图中的数据。这是我第一次被这么长时间的类似任务弄糊涂,但仍然不明白。很抱歉反应太晚。yes GET用于显示。您正在使用资源路由,是吗?。那很好。那么您的表单操作必须是'/laravel/public/posts/create'
而不是'/laravel/public/posts/store'
。将ajax url更改为该url。功能是存储,而不是创建。”公共函数存储(请求$Request){dd($Request);//这将显示从请求$id=$Request->id//访问请求对象id}接收的数据