动态选择选项取决于laravel

时间:2018-03-09 08:11:38

标签: ajax laravel

我有两个表作为用户和部门。我的departments表有两列作为id和title,我的users表包含用户信息列和一个exta列作为dept_id,它与department表id相关。 我想为部门创建一个下拉选择选项,当选择部门时,具有相关部门ID的用户应显示在另一个下拉列表中,我该怎么做..?
 我正在获取控制器中的所有用户和部门数据并将其发送到视图。

我的控制器是......



    public function index()
    {
      $user = DB::table('users')->get();
      $dept =  DB::table('departments')->get();
      return view('userview', compact('user', 'dept'));
    }




我的观点是......



<select class="form-control" id="department" name="department" >
           @foreach($dept as $dept)
                 <option value="{{ $dept->id }}">{{ $dept->name }}</option>
            @endforeach
 </select>    
 
 
 <select class="form-control" id="user" name="user" >     
      <option>   </option>  
 </select>                                          
&#13;
&#13;
&#13;

1 个答案:

答案 0 :(得分:3)

我会使用Ajax请求来获取相关用户并填充第二个列表。在UserDepartment模型中设置关系,例如:

// Department.php
public function users() {
    return $this->hasMany(User::class);
}

// User.php
public function department() {
    return $this->belongsTo(Department::class);
}

在您的控制器中:

// DepartmentController.php
public function index() { 
    return view('userview', [
        'departments' => Department::all()
    ]);
}

public function users(Request $request, $id) {
    if ($request->ajax()) {
        return response()->json([
            'users' => User::where('dept_id', $id)->get()
        ]);
    }
}

然后在您的视图中,在第一个选择上为更改事件设置事件侦听器:

<select class="form-control" id="department" name="department" >
     @foreach($departments as $dept) 
        <option value="{{ $dept->id }}">{{ $dept->name }}</option>
     @endforeach 
</select> 

<select class="form-control" id="user" name="user" ></select>

<script>
    $('#department').on('change', e => {
        $('#user').empty()
        $.ajax({
            url: `/departments/${e.value}/users`,
            success: data => {
                data.users.forEach(user =>
                    $('#user').append(`<option value="${user.id}">${user.name}</option>`)
                )
            }
        })
    })
</script>