Вызов неопределенной связи [роль] в модели [Приложение \ Сотрудник] - PullRequest
1 голос
/ 02 октября 2019

Привет, я пытаюсь показать роли, назначенные сотрудникам, используя красноречивые отношения «многие ко многим», но в нем говорится: Призыв к неопределенным отношениям [роль] в модели [App \ Employee]. Я применил множество решений из сети, но никто не работает для меня

  public function index()
  {
    $employees = Employee::with('role')->get();
    return view('relations.many-to-many.employee.index', compact('employees'));

   @foreach($employees as $employee)
                <tr>
                  <td>
                    {{ $employee->employee_name }}
                  </td>
                  <td>
                    {{ $employee->role->role_name }}
                  </td>

                </tr>
                @endforeach  

модель сотрудника

   public function roles()
   {
    return $this->belongsToMany(Role::class, 'role_employee');
    }

роль модели

  public function employees()
  {
    return $this->belongsToMany(employee::class, 'role_employee');
  }

миграция сотрудников

  Schema::create('employees', function (Blueprint $table) {
        $table->bigIncrements('id');
        $table->string('employee_name');
        $table->timestamps();
    });

роли

 Schema::create('roles', function (Blueprint $table) {
        $table->bigIncrements('id');
        $table->string('role_name');
        $table->timestamps();
    });

role_employee

    Schema::create('role_employee', function (Blueprint $table) {
        $table->bigIncrements('id');
        $table->integer('employee_id')->unsigned();
        $table->integer('role_id')->unsigned();
        $table->timestamps();
    });

Ответы [ 4 ]

1 голос
/ 02 октября 2019

Первый запрос на изменение в соответствии с вашим именем отношения:

$employees = Employee::with('roles')->get();

Поскольку у вас есть отношение «многие ко многим», один сотрудник может иметь несколько ролей, измените код, как показано ниже

@foreach($employees as $employee)
<tr>
  <td>
    {{ $employee->employee_name }}
  </td>
  <td>
    @foreach($employees->roles as $role)
      {{ $role->role_name }} <br>
    @endforeach
  </td>
</tr>
@endforeach

Изменить: Обновить ваш модальный, как показано ниже Модель сотрудника

 public function roles(){
      return $this->belongsToMany(Role::class, 'role_employee','employee_id','role_id');
    }

Ролевая модель

 public function employees() {
      return $this->belongsToMany(Employee::class,'role_employee','role_id','employee_id');
    } 

Ссылка: https://laravel.com/docs/6.x/eloquent-relationships#many-to-many-polymorphic-relations

0 голосов
/ 02 октября 2019

В вашем контроллере

public function index()
  {
    $employees = Employee::with('roles')->get();
    return view('relations.many-to-many.employee.index', compact('employees'));
  } 

модель сотрудника

   public function roles()
   {
    return $this->belongsToMany(Role::class, 'role_employee');
   }

роль модели

  public function employees()
  {
    return $this->belongsToMany(employee::class, 'role_employee');
  }

миграция сотрудников

  Schema::create('employees', function (Blueprint $table) {
        $table->bigIncrements('id');
        $table->string('employee_name');
        $table->timestamps();
    });

ролей

 Schema::create('roles', function (Blueprint $table) {
        $table->bigIncrements('id');
        $table->string('role_name');
        $table->timestamps();
    });

role_employee

Schema::create('role_employee', function (Blueprint $table) {
    $table->bigIncrements('id');
    $table->integer('employee_id')->unsigned();
    $table->integer('role_id')->unsigned();
    $table->timestamps();
});

В вашем файле отношениях.

0 голосов
/ 02 октября 2019

Вы по ошибке использовали role вместо roles

$employees = Employee::with('roles')->get();
@foreach($employees as $employee)
            <tr>
              <td>
                {{ $employee->employee_name }}
              </td>
              <td>
               @foreach($employee->roles as $role)
               {{$role->role_name}}
               @endforeach
              </td>

            </tr>
@endforeach

Обновление

Измените имя сводной таблицы с role_employee на employee_role, а затем обновите миграции,

Обновление 2

Роли сотрудников являются коллекцией, поэтому они должны быть внутри цикла foreach

0 голосов
/ 02 октября 2019

Вы определили метод roles как в отношениях и доступе role

Попробуйте это.

$employees = Employee::with('roles')->get();


@foreach($employees as $employee)
  <tr>
     <td>
         {{ $employee->employee_name }}
     </td>
     <td>
         {{ implode(', ', $employee->roles->pluck('role_name ')->toArray()) }}
     </td>
  </tr>
@endforeach 

Модель Сотрудник

public function roles(){
  return $this->belongsToMany(Role::class, 'role_employee','employee_id','role_id');
}

Роль модели

public function employees() {
  return $this->belongsToMany(Employee::class,'role_employee','role_id','employee_id');
} 
...