Sharmae Reyes
Sharmae Reyes

Reputation: 115

Load dependent dropdown on Edit Laravel

How to automatically load or retrieve the subcategory/dependent dropdown based on the selected value of parent dropdown in Edit. If I click the edit, the doctor should instantly load. I've been searching for hours for the solutions please help.

Blade

<select name="clinic_id" data-placeholder="Search" data-allow-clear="true"
   class="form-control select2bs4" style="width: 100%;" id="load_clinic">
   <option selected="selected"></option>
       @foreach ($clinic as $id => $item)
         <option value="{{ $id }}"
             {{ $schedule->clinic_id == $id ? 'selected' : '' }}>
              {{ $item }}
         </option>
       @endforeach
</select>

<select name="doctor_id" data-placeholder="Search" data-allow-clear="true"
    class="form-control select2bs4" style="width: 100%;" id="load_doctor">
</select>

Javascript

 $(document).ready(function() {
        $('#load_clinic').on('change', function(e) {
            var clinic_id = e.target.value;
            if (clinic_id) {
                $.ajax({
                    url: "{{ route('getDoctor') }}",
                    type: "POST",
                    data: {
                        clinic_id: clinic_id,
                        _token: "{{ csrf_token() }}"
                    },
                    success: function(data) {
                        if (data) {
                            $('#load_doctor').empty();
                            $('#load_doctor').append(
                                '<option value=""> Select Doctor</option>');
                            $.each(data, function(key, value) {
                                $('#load_doctor').append($(
                                    "<option/>", {
                                        value: key,
                                        text: value
                                    }));

                            });
                        } else {
                            $('#load_doctor').empty();
                        }
                    }
                })
            } else {
                $('#load_doctor').empty();
            }
        });
    });

Controller

public function edit($id)
{
    $schedule = Schedule::findOrFail($id);
    $clinic = Clinic::pluck('name', 'id');
    $doctor = Doctor::get()->pluck('full_name', 'id');
    return view('admin.schedule.edit', compact('schedule', 'doctor', 'clinic'));
}

public function getDoctor(Request $request)
{
    $id = $request->clinic_id;
    $doctor = Doctor::where('clinic_id', $id)->get()->pluck('full_name', 'id');
    return response()->json($doctor);
}

Upvotes: 0

Views: 384

Answers (1)

Ademir Šehić
Ademir Šehić

Reputation: 146

You can get initial select options with PHP before resorting to ajax.

Consider using plural nouns when you are using get() and singular when using i.e. first()

Also, consider using @if(condition) @endif instead of ternary operators in blade

This is solution with PHP, if you want to get doctors with AJAX, in addition to onChange listener, you should also call it when page loads,

Controller

public function edit($id)
{
    $schedule = Schedule::findOrFail($id);
    $clinic = Clinic::pluck('name', 'id');
    $doctor = Doctor::where('clinic_id', $schedule->clinic_id)->get();
    return view("admin.schedule.edit", compact('schedule', 'doctor', 'clinic'));
}

Blade

<select name="clinic_id" data-placeholder="Search" data-allow-clear="true"
   class="form-control select2bs4" style="width: 100%;" id="load_clinic">
   <option selected="selected"></option>
       @foreach ($clinic as $id => $item)
         <option value="{{ $id }}"
             {{ $schedule->clinic_id == $id ? 'selected' : '' }}>
              {{ $item }}
         </option>
       @endforeach
</select>

<select name="doctor_id" data-placeholder="Search" data-allow-clear="true"
    class="form-control select2bs4" style="width: 100%;" id="load_doctor">
    @foreach($doctor as $item)
        <option value="{{$item->id}}">{{$item->full_name}}</option>
    @endforeach
</select>

Upvotes: 1

Related Questions