Как отфильтровать коллекцию моделей на основе выбранного параметра в выпадающем списке в коллективной форме?

#laravel #forms #filter #bootstrap-4 #laravelcollective

#laravel #формы #Фильтр #bootstrap-4 #laravelcollective

Вопрос:

Я создаю веб-приложение mall directory. Я хотел бы отобразить список групп клиентов на основе опции выпадающего списка. (группировать по зонам / этажам / категориям)

Изначально я пытался передать выбранную опцию из выпадающего списка зоны в форме в DirectoryController через маршруты, но я не смог этого сделать.

 <!-- Part of the View -->
<div class = "panel-body bg-light">
        {{ Form::open(array('route' => array('directory.group', '$tenants', 'zone_id'))) }}
        <div class = "container-fluid bg-default">
            <table class="table table-borderless">
                <thead>
                    <th scope="col"><strong>ZONE<strong></th>
                    <th scope="col"><strong>FLOOR<strong></th>
                    <th scope="col"><strong>CATEGORY<strong></th>
                </thead>
                <tbody>
                    <tr>
                        <td>
                            <!-- Zone -->
                            <div>
                                {!! Form::select('zone_id',
                                    Zone::pluck('code', 'id'), null, [
                                        'class' => 'form-control',
                                        'placeholder' => '- Select Zone -',
                                        'onchange' => 'this.form.submit()'
                                    ] )
                                !!}
                            </div>
                        </td>
                        <td>
                            <!-- Floor -->
                            <div>
                                {!! Form::select('floor_id',
                                    Floor::pluck('code', 'id'), null, [
                                        'class' => 'form-control',
                                        'placeholder' => '- Select Zone -',
                                ]) !!}
                            </div>
                        </td>
                        <td>
                            <!-- Category -->
                            <div>
                                {!! Form::select('category_id',
                                    Category::pluck('name', 'id'), null, [
                                        'class' => 'form-control',
                                        'placeholder' => '- Select Zone -',
                                ]) !!}
                            </div>
                        </td>
                    </tr>
                </tbody>
            </table>

        </div>

    {!! Form::close() !!}
</div>
  

DirectoryController

 /**
 * Show the application dashboard.
 * @param array $tenants
 * @param int $zone_id
 *
 * @return IlluminateHttpResponse
 */
public function group($tenants, $zone_id)
{
    $tenants = $tenants->where('zone_id', $zone_id);

    return view('directory.index', [
        'tenants' => $tenants,
    ]);

}
  

Моя концепция заключается в передаче списка арендаторов в DiretoryController @group, и функция будет фильтровать на основе выбранной опции выпадающего списка и передавать новый список арендаторов обратно в представление и отображать его.

Я был бы очень признателен, если бы было какое-либо предложение или решение.

Комментарии:

1. Если одно из приведенных ниже сообщений ответило на ваш вопрос, пожалуйста, можете ли вы пометить его как принятый 🙂 Спасибо.

Ответ №1:

Вы можете привязать onchange для выбора и вызова ajax при каждом событии изменения.

   $(document).ready(function () {
        $('#zone_id').on('change',function () {
            var id = this.value;
            $.ajax({
                type: 'GET',
                url: 'url',
                data: {
                    id:id
                },
                dataType: 'json',
                success: function (json) {
                    $('#zone_id').html(' ');
                    $.each(json, function(i, value) {
                        $('#zone_id').append($('<option>').text(value).attr('value', i));
                    });
                }
            });
        });
    });
  

Комментарии:

1. Спасибо за вашу помощь! Это много значило для меня.

Ответ №2:

Значения из формы не будут передаваться в качестве параметров методу контроллера, вам нужно будет использовать форму класса Request для этого. Вы можете либо использовать вспомогательную функцию request():

 request()->input('zone_id');
  

или

Внедрение зависимостей

 public function group(IlluminateHttpRequest $request, $tenants)
{
    $tenants = $tenants->where('zone_id', $request->input('zone_id'));

    return view('directory.index', [
        'tenants' => $tenants,
    ]);

}
  

Комментарии:

1. Спасибо за вашу помощь! Надеюсь, у вас хороший день