Ajax仅发送所选数据

时间:2018-09-19 05:23:19

标签: jquery ajax laravel

我有一个ajax代码,只有当我为所有选择都选择选项时,它才起作用。

问题

Select box 1 (option selected)
Select Box 2 (option selected)
Select Box 3 (option didn't select)

result: code 500 (won't send data)

//////////////////////

Select Box 1 (option selected)
Select Box 2 (option selected)
Select Box 3 (option selected)

result: code 200 (sending data)

代码

<script defer>
$(document).ready(function() {
    $('body').on("change", ".autosubspecifications", function() {
      var form = $(this).closest('form');
      var id = form.find('input[name="product_id"]').val();

      // An array to store the subspecifications values.
      var spec_array = [];

      // A loop to go through all them.
      form.find('select.autosubspecifications option:selected').each(function(){
        spec_array.push($(this).val());
      });

      console.log(id);
      $.ajax({
        type: "post",
        url: '{{ url('admin/spacssendto') }}',
        data: {
          '_token': $('input[name=_token]').val(),
          'product_id': id,
          'subspecifications': spec_array,
        },
        success: function (data) {
          alert('Specifications added successfully.');
          console.log($(this));
        },
        error: function (data) {
          console.log(data);
        }
      });
    });
  });
</script>

我想要的

如果我为两个或什至一个选择框选择选项时,将按照选择的数据发送代码200,而不是被迫为所有选择项选择值。

有什么主意吗?

更新

这是我的后端(控制器)

public function spacssendto(Request $request)
{
      $this->validate($request, array(
          'product_id' => 'required',
          'subspecifications' => 'required',
        ));
        $product = Product::find($request->product_id);
        $product->subspecifications()->sync($request->subspecifications, false);
}

同步方法

我的同步方法的作用是将product_idsubspecification_id存储到名为product_subspecification的表中

database

one

how data are passing currently

two

错误

作为我的网络响应(当我没有从所有选择框中选择选项时),我得到:

SQLSTATE[23000]: Integrity constraint violation: 1452 Cannot add or update a child row: a foreign key constraint fails (`u641790295_kargr`.`product_subspecification`, CONSTRAINT `product_subspecification_subspecification_id_foreign` FOREIGN KEY (`subspecification_id`) REFERENCES `subspecifications` (`id`)) (SQL: insert into `product_subspecification` (`product_id`, `subspecification_id`) values (21, ))

更新2

为了避免忽略子规范的空值并避免后端出错,我进行了一些更改,这是我当前的代码:

public function spacssendto(Request $request) {
        $this->validate($request, array(
          'product_id' => 'required',
          'subspecifications' => 'required',
        ));
        $product = Product::find($request->product_id);

        $looped = $request->subspecifications;
        $spec = [];
        foreach($looped as $loope){
            if($loope != ''){
                $spec[] = $loope;
            }
        }

        if(isset($spec)) {
            $product->subspecifications()->sync($spec, false);
        }
    }

这样,我只能得到具有值的数组项(上面的图像2)。

到目前为止一切顺利,

当我替换以前的一个选项时,问题就来了,除了被编辑,它还会累加起来。

sample

1

2

3

4

有什么主意,我该如何进行替换?

  

PS:默认情况下,sync方法会进行替换,但由于我已经   空值的问题,并提供了如果现在在我的控制器中,我迷路了   同步替换的功能。

2 个答案:

答案 0 :(得分:0)

返回码500表示您的后端代码(在ajax调用之后)失败。 您可以执行以下任一操作:

1)在后端修复该代码以处理丢失的值,即,如果找不到所需的内容,请妥善处理该情况(例如使用默认值),以免失败

2),也可以通过填写缺失值在客户端(js)上执行相同操作。 像这样:

    ...
          // A loop to go through all of selects.
          form.find('select.autosubspecifications').each(function() 
          {
            var selectedOption = $(this).val() || "sensible-default-value";
            spec_array.push(selectedOption);
          });
...

答案 1 :(得分:0)

  

对于(更新2)中的问题,此问题已解决了50%(更新1)   我提出了一个新问题 [here]