как создать реляционную опцию выбора ajax в laravel 5.2 - PullRequest
0 голосов
/ 24 июня 2018

Мы хотим создать опцию реляционного выбора с помощью ajax. Получать данные из MySQL на Ларавелла 5.2.

У нас есть три варианта выбора: «тип», «бренд» и «название продукта».

Когда выбран тип, должны быть загружены соответствующие бренды, а после этого, когда выбран бренд, должны быть загружены названия соответствующих продуктов в последнем выборе.

1 Ответ

0 голосов
/ 24 июня 2018

Я попробую объяснить на примере.

давайте рассмотрим, что у вас есть три таблицы с именами (страны, штаты, города) и предположим, что вы используете jquery.

страны:

id | name          | code | **
--------------------------------
 1 | united states | US   | etc

состояния:

id | country_id  | name
--------------------------------
 1 | 1           | Texas

города:

id |state_id | name
--------------------------------
 1 | 1       | Houston

поэтому у вас будет три модели, которые желательно называть Страна, Штат, Город

нам нужно два маршрута для загрузки штатов и городов

Route::post( '/get/states', 'WorldController@states' )->name( 'loadStates' );
Route::post( '/get/cities', 'WorldController@cities' )->name( 'loadCities' );

и в нашем контроллере (здесь WorldController) у нас есть два метода:

function states( Request $request )
{
      $this->validate( $request, [ 'id' => 'required|exists:countries,id' ] );
      $states = State::where('country_id', $request->get('id') )->get();
      //you can handle output in different ways, I just use a custom filled array. you may pluck data and directly output your data.
      $output = [];
      foreach( $states as $state )
      {
         $output[$state->id] = $state->name;
      }
      return $output;
}
function cities( Request $request )
{
      $this->validate( $request, [ 'id' => 'required|exists:states,id' ] );
      $cities = City::where('state_id', $request->get('id') )->get();
      $output = [];
      foreach( $cities as $city )
      {
         $output[$city->id] = $city->name;
      }
      return $output;
}

и у нас будет три варианта:

<select name="country" id="country">
   @foreach( Country::get() as $country )
      <option value="{{ $country->id }}">{{ $country->name }}</option>
   @endforach
</select>
<select name="state" id="state"></option>
<select name="city" id="city"></option>

, поскольку мы предполагали, что вы используете jquery, мы обновляем наши параметры выбора следующим образом:

<script>
$('#country').change(function(){
   $("#state option").remove();
   $("#city option").remove();
   var id = $(this).value();
   $.ajax({
      url : '{{ route( 'loadStates' ) }}',
      data: {
        "_token": "{{ csrf_token() }}",
        "id": id
        },
      type: 'post',
      dataType: 'json',
      success: function( result )
      {
           $.each( result, function(k, v) {
                $('#state').append($('<option>', {value:k, text:v}));
           });
      },
      error: function()
     {
         //handle errors
         alert('error...');
     }
   });
});
$('#state').change(function(){
   $("#city option").remove();
   var id = $(this).value();
   $.ajax({
      url : '{{ route( 'loadCities' ) }}',
      data: {
        "_token": "{{ csrf_token() }}",
        "id": id
        },
      type: 'post',
      dataType: 'json',
      success: function( result )
      {
           $.each( result, function(k, v) {
                $('#city').append($('<option>', {value:k, text:v}));
           });
      },
      error: function()
     {
         //handle errors
         alert('error...');
     }
   });
});
</script>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...