Красноречивая связь, указывающая на записи в одной таблице - PullRequest
0 голосов
/ 25 октября 2018

У меня есть следующая таблица сотрудников:

  • id
  • имя
  • руководитель

Это все сотрудники вэто и единственная таблица, которая у меня есть

Поле supervisor содержит id из supervisor, которое сохраняется в той же таблице, что и employee.

У меня есть таблица, которая распечатывает список всех employees и их supervisors.

Прямо сейчас он печатает только id супервизора.Я пытаюсь перевести это id на имя supervisor.Так что я решил использовать 'ownTo ()' & 'hasMany ()' в той же модели.

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

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

//
public function employee(){
    return $this->belongsTo('Employee', 'id');
}

public function manager(){
    return $this->hasMany('Employee', 'id');
}

EmployeeController

$employees = Employee::all();
return view('employee/index')->with('employees', $employees, $employees->manager);

index

<td>
   {{$employee->$manager->name}}
</td>

Ответы [ 2 ]

0 голосов
/ 25 октября 2018

В этом ответе я предполагаю, что supervisor - это идентификатор сотрудника руководителя.


Что-то не так с вашими отношениями, второй параметр hasMany и belongsToМетоды должны быть внешним ключом связанной модели (в данном случае это та же модель, но ключ, который ссылается на родительский объект, например supervisor).Проверьте документацию относительно этой темы:

Как и метод hasOne, вы также можете переопределить внешние и локальные ключи, передав дополнительные аргументы методу hasMany:

return $this->hasMany('App\Comment', 'foreign_key');

return $this->hasMany('App\Comment', 'foreign_key', 'local_key');

Вы должны определить свои отношения следующим образом:

Employee.php

// a Manager has many employees
public function employees(){
    return $this->hasMany(Employee::class, 'supervisor'); 
}

// an Employee works for a Manager
public function manager(){
    return $this->belongsTo(Employee::class, 'supervisor');
}

Затем в контроллере:

app / Http / Controllers / SomeCoolController.php

$employees_with_manager = Employee::with('manager')->get();

return view('employee/index')->with('employees', $employees_with_manager);

Так что, на ваш взгляд, этого будет достаточно:

employee / index.blade.php

@foreach ($employees as $employee)
    <td>
       {{ $employee->manager->name }}
    </td>
@endforeach
0 голосов
/ 25 октября 2018

У каждого сотрудника есть несколько менеджеров, поэтому нет такой вещи как $employees->manager

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

$employees = Employee:: with ('manager')->get(); 
return view('employee/index')->with('employees', $employees);
...