首页 > 解决方案 > Laravel - 如何创建递归选择选项下拉列表

问题描述

我正在使用 Laravel-5.8 开发一个 Web 应用程序。我有这个模型:

class Staff extends Model
{
  protected $fillable = [
      'staff_code',
      'manager_id',
      'first_name',
      'last_name',
  ];

 public function manager()
 {
   return $this->belongsTo('App\Models\Staff','manager_id');
 }

 public function fullName()
 {
  return $this->staff_code . ' - ' . $this->first_name . ' ' . $this->last_name;
 }

在创建员工数据时,我想从员工表中为每个员工选择一个经理,并将其作为 manager_id 保存到同一个表中,但显示为经理姓名。仍然来自同一张桌子。

控制器

public function create()
{
  $managers       =       Staff::all();
  return view('staff.create')
    ->with('managers', $managers);
}

看法

<div class="form-group">
<label class="control-label"> Manager:</label>
  <select class="form-control select2bs4" data-placeholder="Choose Manager" tabindex="1" name="manager_id" style="width: 100%;">
  <option value="">Select Line Manager</option>
     @if($managers->count() > 0 )
        @foreach($managers as $manager)
          <option value="{{$manager->id}}">{{$manager->fullName}}</option>
        @endforeach
     @endif
  </select>
</div>

我观察到下拉列表中没有加载任何内容。我该如何解决这个问题?

谢谢你。

标签: laravel

解决方案


当你这样做时$manager->fullName,你正在使用在这种情况下不存在的 Eloquent 关系。你应该改用这个:

$manager->fullName()

除此之外,我建议您针对这种特定情况使用Laravel 访问器。结果,您将在模型中拥有这样的代码:

 public function getFullNameAttribute()
 {
     return $this->staff_code . ' - ' . $this->first_name . ' ' . $this->last_name;
 }

所以我们可以重写视图中的代码如下:

@foreach($managers as $manager)
    <option value="{{$manager->id}}">{{$manager->full_name}}</option>
@endforeach

推荐阅读