如何使用AJAX将数据传递给Laravel中的Controller?

时间:2017-12-06 19:03:53

标签: 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);

  // 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时,我得到了我需要的一切(我已经在我的数据库中的表之间有了相关性)。

我需要做的就是发送制造商的值(onchange)并将其传递给我的PostsController中的变量$ sendedID。我可能需要更改我的PostController中的代码,只是不知道如何,我已经研究了很多,但找不到答案。感谢任何想知道如何修复它的人。

3 个答案:

答案 0 :(得分:1)

在你的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'
        )
    );
}

答案 1 :(得分:0)

据我所知,你需要的是:

  

您的所有manufacturers都有一个下拉列表。当用户选择一个时,cars的选项也会发生变化。

如果您想通过 ajax 实现此目标,则必须创建一个单独的方法来返回特定cars的所有manufacturer。让我们说

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); 
        }, 
    }); 
});

答案 2 :(得分:0)

首先,您必须附加X-CSRF-TOKEN以通过AJAX请求发送数据。在发送ajax请求数据之前检查你的javascript变量,然后在控制器dd()中,ajax成功发送数据请求。

检查路线是否可以通过邮寄发送数据。你可以用php artisan route检查所有已注册的路线:在控制台中列出代码...

如何在ajax体中附加X-CSRF-TOKEN

tidyr

然后检查控制器是否正确接收数据。如果是请求对象,您可以使用$ request-> id

访问该ID
$.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
    }
});