Laravel отправляет несколько идентификаторов на контроллер через ajax - PullRequest
0 голосов
/ 06 мая 2018

Я хочу сделать множественное удаление в laravel 5.5, я пробовал формы, которые не работали, поэтому я решил вместо этого использовать ajax.

Что я пытаюсь сделать:

  1. Используйте флажок для выбора нескольких записей / идентификаторов продуктов.
  2. Отправьте их на контроллер по ajax.
  3. Удалить их.

Коды

controller

public function multipledel(Request $request){
      $deli = $request->input('productsfordel'); //get id's of selected post/products
      $product = Product::where('id', [$deli]); //find those id's in DB
      $product->delete(); // Delete them

      Session::flash('success', 'Selected products are successfully deleted.');
      return redirect()->route('products.index');
    }

route

Route::post('delmultipleproducts', 'ProductController@multipledel')->name('delmultipleproducts');

ajax

<script type="text/javascript">
  $(document).ready(function() {
    $('#multidel').on('click', function(e) {  //define which button to click for multiple delete
      e.preventDefault();
      $.ajaxSetup({
          headers: { 'X-CSRF-TOKEN': $('meta[name="_token"]').attr('content') }
      });

      var idss = $('#productsfordel').val(); //where to get id's from
      if(idss) {
      $.ajax({
        url: '{{ url('admin/delmultipleproducts') }}',
        type: "POST",
        dataType: "json",
        success:function(data) {
          console.log('working');
        }
      });
      }else{
        console.log('not working');
      } 
    });
  });
</script>

blade

<button id="multidel" name="multidel">Delete All</button>

<thead>
  <th class="text-center">xxxxx</th>
</thead>
<tbody>
  @foreach($products as $product)
  <tr>
    <td>
      <input type="checkbox" id="productsfordel" name="productsfordel[]" value="{{ $product->id }}" />
    </td>

// rest of table

Вопросы

вот что я получаю в своей сети в результате:

screen 1

Есть идеи?

UPDATE

Основываясь на Бабак ответ Я могу получить какой-то результат в сети, что означает, что идентификаторы фактически отправляются, вот ошибка:

SQLSTATE[23000]: Integrity constraint violation: 1451 Cannot delete or update a parent row: a foreign key constraint fails (`mysite`.`product_relatives`, CONSTRAINT `product_relatives_product_id_foreign` FOREIGN KEY (`product_id`) REFERENCES `products` (`id`)) (SQL: delete from `products` where `id` = 48)

поэтому я понимаю, что он должен что-то делать с моим методом синхронизации продуктов, таким как опции и спецификации, и я изменил свою функцию на:

public function multipledel(Request $request){
      $deli = $request->input('productsfordel');
      $product = Product::where('id', [$deli]);
// added from here
      $product->suboptions()->detach();
      $product->subspecifications()->detach();
      if(!empty($product->imageOne)){
        Storage::delete($product->imageOne);
      }
      if(!empty($product->imageTwo)){
        Storage::delete($product->imageTwo);
      }
//to here
      $product->delete();

      Session::flash('success', 'Selected products are successfully deleted.');
      return redirect()->route('products.index');
    }

Теперь я получаю:

Call to undefined method Illuminate\Database\Query\Builder::suboptions()

есть идеи?

Ответы [ 2 ]

0 голосов
/ 06 мая 2018

Прежде всего добавьте данные в ваш ajax

  var idss = $('#productsfordel').val();
  if(idss) {
  $.ajax({
    url: '{{ url('admin/delmultipleproducts') }}',
    type: "POST",
    dataType: "json",
    data: {
    productsfordel: idss
    }
    success:function(data) {
      console.log('working');
    }
  });
  }else{
    console.log('not working');
  } 

Затем добавьте foreach в свой контроллер, как это

    $deli = $request->get('productsfordel'); //get id's of selected post/products
   Foreach($deli as $item){
  $product = Product::find($item); //find those id's in DB
  $product->delete(); // Delete them
    }
0 голосов
/ 06 мая 2018

Вы даете своим входам один и тот же идентификатор: не очень хорошая идея. Сначала вы должны удалить атрибут id из ваших входных тегов.

Тогда вам лучше заключить свои входные данные в тег формы с идентификатором (скажем, "myForm"):

<form id="myForm">
    <table>
    // ...
    @foreach($products as $product)
        <tr>
            <td>
                <input type="checkbox" id="productsfordel" name="productsfordel[]" value="{{ $product->id }}" />
            </td>
    // ...
    </table>
</form>

Нет необходимости устанавливать какой-либо метод действия, так как маршрут определен в вашем Ajax-запросе.

Говоря о вашем Ajax-запросе, не забудьте передать ваши данные (т. Е. Массив идентификаторов) со свойством data, например так:

...
dataType: "json"
data : $('#myForm').serialize()

Таким образом, контроллер получает массив идентификаторов, которые вы можете удалить с помощью метода уничтожения Eloquent:

Product::destroy($request->input('productsfordel'));

РЕДАКТИРОВАТЬ : Если вы не хотите использовать форму, вы можете вместо этого дать своим входам класс вместо идентификатора (class = "someClass") и затем передать свои данные с помощью

data: $('.someClass:checked').serialize(),
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...