Laravel. Выборка записей с параметром из формы

Всем привет! Можете помочь с выборкой записей по параметру, который выбирается из шаблона. Имеются две таблицы со связью 1(Типы_Неисправности) ко М(Неисправности), На форме (blade-template) размещены два списка(select). При выборе типа_неисправности в первом списке, во 2м списке должны быть доступны записи о неисправностях,
которые принадлежат к типу_неисправности, выбранного из 1го списка.

// модель Type
public function defects() {
  return $this->hasMany('App\Models\Defect');
} 

// модель Defect 
public function type()
{
  return $this->belongsTo('App\Models\Type');
}

// записи о типах_неисправности
$types = Type::get();

// выборка записей по заданному id типа_неисправности
$defects = DB::table('defects')->where('type_id', 4)->get();

// вывод записей для 1го списка(Типы_Неисправности)
<select>
 @foreach($types as $type)
  <option value="{{ $type->id }}">
    {{ $type->name }}
  </option>
 @endforeach
</select>

Как изменить выборку на динамический id? И как применить этот id в шаблоне чтобы вывести записи во 2м списке, после выбора типа неисправности из 1го списка?


Ответы (2 шт):

Автор решения: Xaku

Первую выборку необходимо вставить в форму, после нажатия кнопки во второй выборке появятся данные

<form method = "get">
    <select name = "type_id">
        <option disabled selected>Выберите тип</option>
        @foreach($types as $type)
        <option value = "{{ $type->id }}">
            {{ ucfirst($type->name) }}
        </option>
        @endforeach
    </select>
    <button type = "submit">Выбрать</button>
</form>

Также передаем во вторую форму type_id

<form method = "get">
    <input type = "hidden" name = "type_id" value = "{{ $request->type_id }}">
    <select name = "defect_id">
        <option disabled selected>Выберите неисправность</option>
        @foreach($defects as $defect)
        <option value = "{{ $defect->id }}" >
            {{ ucfirst($defect->desc) }}
        </option>
        @endforeach
    </select>
    <button type = "submit">Отправить</button>
</form>
→ Ссылка
Автор решения: nicolaa

Для обновления информации без перезагрузки страницы, вам нужно использовать js
Можно попробовать сделать так:

Добавляем новый путь

Route::get('/defect/get', 'DefectController@defectGet')->name('defect.get');

В кнотроллер Defect добавляем

public function defectGet(Request $request) {
    $id = $request->input('id');//Получаем id
    $rez['rez'] = 0;//Делаем по дефолту 0
    if($id) {//Проверяем пришел ли id
        $defects = Defect::where('type_id', $id)->get();//Делаем запрос на получения
        if($defects) {//Проверяем есть или нет неисправности
            $option = '<option disabled selected>Выберите неисправность</option>';//Первый оптион по дефолту выбор
            foreach ($defects as $defect) {//Перебираем все неисправности
                $option .= ' <option value="'.$defect->id.'" >'.$defect->desc.'</option>';//И добавляем их в переменную
            }
            $rez = [
                'rez' => 1,
                'option' => $option
            ];
        }
    }
    return $rez;//Выводим результат
}

Во вью

<select name="type_id" id="type">
  <option disabled selected>Выберите тип</option>
   @foreach($types as $type)
    <option value="{{ $type->id }}">
     {{ ucfirst($type->name) }}
    </option>
   @endforeach
 </select>

<select name="defect_id" id="defect">
</select>

<script>
    $(document).ready(function(){//Ждем полной загрузки страницы
        $('#type').change(function() {//Отслеживаем изменения Типа
            let id = $(this).val();//Помещаем в переменную, полученное значение из Типа
            if (id) {//Проверяем есть ли оно
                axios({//Отправляем get запрос
                    method: 'get',
                    url: '/defect/get',
                    params: {id}
                }).then((response) => {
                    if(response.data.rez) {//Проверяем ответ 1 или 0
                        $('#defect').html(response.data.option);//Если пришел 1, то вставляем option в Неисправность
                    }
                });
            }
            return false;
        });
    });
</script>
→ Ссылка