Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/laravel/10.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
如何使用AJAX将数据传递给Laravel中的控制器?_Ajax_Laravel - Fatal编程技术网

如何使用AJAX将数据传递给Laravel中的控制器?

如何使用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); //

我真的被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);

  // 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}接收的数据