Зависимый раскрывающийся список - JQuery - Ajax

Заказчик может быть назначен на многие компании. Поэтому при выборе клиента должны появиться соответствующие компании. Вместо названий компаний я получаю company_ids Как я могу получить названия компаний

Я думаю, что я почти у цели

Я включил части контроллера, представления и jquery ниже

JobController.php

public function edit(Job $job)
    {
        $subJobs = $job->sub_jobs;
        $customers = User::all();
        $selectedCustomer = $job->user_id;
        //dd($selectedCustomer);
        $companies = Company::all();
        $selectedCompany = $job->company_id;
        return view('employees.jobs.edit', compact('job', 'subJobs', 'customers', 'selectedCustomer', 'companies', 'selectedCompany'));
    }


    public function ajax(Job $job)
    {
      //Get the Job Number
      $id = $job->id;

      //Get the user_id of the job
      $userId = Job::where('id', '=', $id)->pluck('user_id')->first();

      //Show all customers
      $customers = User::all();
      //dd($customers);
      //Show the companies according to the customer list
      $companies = Job::where('user_id', '=', $userId)
                        ->pluck('company_id')->unique();
      //dd($companies);
      return json_encode($companies);

    }

public function update(Request $request, Job $job)
    {
        $this->validate($request, [
          'job_owner' => 'required'
        ]);

        //dd($request);
        $customer = new User();
        $customer->user_id = $request['customer'];


        $customer = User::Find($request['customer']);
        $customer->companies()->attach($request['company']);
        $customer->save();

        $job->user_id = $request['customer'];
        $job->company_id = $request['company'];
        $job->description= $request['description'];
        $job->owner= $request['owner'];
        $job->status= $request['status'];
        $job->despatch_status= $request['despatch_status'];
        $job->invoice_status= $request['invoice_status'];
        $job->sales_status= $request['sales_status'];
        $job->entered_status= $request['entered_status'];
        $job->delivery_date= $request['delivery_date'];
        $job->delivery_time= $request['delivery_time'];
        $job->comp= $request['comp'];
        $job->cost= $request['cost'];
        $job->profit= $request['profit'];
        $job->price= $request['price'];
        $job->nbt= $request['nbt'];
        $job->vat= $request['vat'];
        $job->total_value= $request['total_value'];
        $job->save();

        $jobs = Job::all();
        return view('employees.jobs.job', compact('jobs', $jobs));
    }

jobs.edit.blade.php

<form action = "{{ route('employee.job.update',$job->id) }}" method = "post">
      @method('PUT')
      @csrf
      <div class = "form-group">
        <label for = "inputJobNumber">Job Number</label>
        <input type = "text" class = "form-control" id = "inputJobNumber" name = "id" value = "{{$job->id}}" readonly>
      </div>
      <div class = "form-group">
        <label for = "inputCustomerName">Customer Name</label>
          <select name = "customer" class = "form-control" id = "inputUser">
             <option value = "">--Select User--</option>
             @if ($customers->count())
               @foreach ($customers as $customer)
               <option value = "{{ $customer->id }}" {{ $selectedCustomer == $customer->id ? 'selected = "selected"' : '' }}>
                  {{ $customer->name }}
                </option>
               @endforeach
             @endif
          </select>
      </div>
      <div class = "form-group">
        <label for = "inputCustomerName">Company Name</label>
          <select name = "company" class = "form-control" id = "inputCompany">
             <option value = "">--Select Company--</option>
             @if ($companies->count())
             @foreach ($companies as $key => $value)
             <option value = "{{ $key }}" {{ $selectedCompany == $key ? 'selected = "selected"' : '' }}>
               {{ $value->name }}
             </option>
             @endforeach
           @endif 

Jquery из jobs.edit.blade.php

<script type = "text/javascript">
      $(document).ready(function() {
          $('select[name = "customer"]').on('change', function() {
              var cusotmerId = $(this).val();
              if (cusotmerId) {
                  $.ajax({
                      url: '/employee/job/ajax/'+cusotmerId,
                      type: "GET",
                      dataType: "json",
                      success:function(data) {
                          $('select[name = "company"]').empty();
                          $.each(data, function(key, value) {
                              $('select[name = "company"]').append('<option value = "'+ key +'">'+ value +'</option>');
                          });
                      }
                  });
              }else{
                  $('select[name = "company"]').empty();
              }
          });
      });
  </script>

Мне нужно получить company_ids, когда указан user_id

$companies = DB::table('jobs')
                  ->where('user_id', '=', $userId)
                  ->join('companies', 'jobs.company_id', '=', 'companies.id')
                  ->get()
                  ->unique();

Я вижу, что вы отлаживали свой $companies с помощью ajax-метода на своем контроллере, но я все еще думаю, что ваш вызов pluck неверен, это должен быть ->pluck('name','company_id') imho. В противном случае вы возвращаете только идентификаторы, а не пары ключ-значение. Можете ли вы попробовать?

Tschitsch 13.08.2018 08:47

@Tschitsch сейчас борется с частью ajax. Названия компаний не меняются в соответствии с именем пользователя

zaster 13.08.2018 10:29

Не уверен, как вы изменили свой код сейчас, но похоже, что ваше условие where неправильно установлено.

Tschitsch 13.08.2018 10:50

@Tschitsch На самом деле название компании следует брать из таблицы компаний, а не из таблицы вакансий. Это кажется сейчас главной проблемой.

zaster 13.08.2018 11:04
Как конвертировать HTML в PDF с помощью jsPDF
Как конвертировать HTML в PDF с помощью jsPDF
В этой статье мы рассмотрим, как конвертировать HTML в PDF с помощью jsPDF. Здесь мы узнаем, как конвертировать HTML в PDF с помощью javascript.
1
4
264
1

Ответы 1

Глядя на свой jobs.edit.blade.php, вы запрашиваете /employee/job/ajax/'+cusotmerId при смене клиента, но для вашего метода JobController::ajax требуется экземпляр Job $job в качестве параметра, что кажется неправильным, попробуйте вместо этого эту имплементацию для JobController::ajax:

public function ajax(Customer $customer)
{
    $companies = $customer->companies()->pluck("name", "company_id");
    return json_encode($companies);
}

ОБНОВИТЬ

Предположим, JobController::ajax действительно получает задание экземпляра. Основываясь на коде, который я вижу, вы можете реализовать это так:

public function ajax(Job $job)
{
    $userId = $job->user_id;
    $companies = Company::whereHas('jobs', function($query) use ($userId) {
        $query->where('user_id', '=', $userId);
    })->pluck('name', 'company_id');

    return json_encode($companies);
}

Если связь jobs еще не существует, вам необходимо обновить модель Company с помощью

public function jobs() {
    return $this->hasMany(Job::class);
}

Я предпочитаю использовать функцию publich ajax (Job $ job), потому что все происходит через JobController. Мне нужно получить company_ids, когда указан user_id. Я вижу, что соединение должно быть ответом. Обновил исходный пост с присоединением. Хотя это не дает ответа, который мне нужен.

zaster 13.08.2018 13:40

Что ж, я обновил свой ответ, но я бы порекомендовал вам немного очистить свой код, поскольку есть несколько вводящих в заблуждение имен переменных, пара вызовов отладки и даже бесполезные / избыточные фрагменты кода.

Tschitsch 13.08.2018 15:18

Похоже, что часть контроллера готова. Теперь проблема в обзоре. Меню не действует как зависимое раскрывающееся меню

zaster 14.08.2018 01:50

Другие вопросы по теме