【问题标题】:Eloquent relationship to point to records in the same table雄辩的关系指向同一张表中的记录
【发布时间】:2018-10-25 14:01:26
【问题描述】:

我有一个员工表如下:

  • 身份证
  • 姓名
  • 主管

里面有所有员工,也是我唯一的桌子

supervisor 字段包含supervisorid,与employee 保存在同一个表中。

我有一张表格,可以打印出所有employees 及其supervisors 的列表。

现在,它只打印主管的id。我正在尝试将 id 翻译成 supervisor 的名称。所以我决定在同一个模型中使用 'belongsTo()' & 'hasMany()'。

我尝试了各种型号和控制器代码,但每次都弹出不同的错误。我认为我的控制器方面是问题所在。

员工模型

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

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

员工控制器

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

索引

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

【问题讨论】:

  • 你不应该使用$manager。删除$,使其看起来像$employee-&gt;manager-&gt;name

标签: php laravel eloquent relational-database


【解决方案1】:

在这个答案中,我假设 supervisor 是主管的员工 ID。


你的关系有问题,hasManybelongsTo方法的第二个参数需要是相关模型的外键(本例是同一个模型,但是引用父对象的键,例如supervisor)。检查documentation关于这个主题:

与 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);

所以在你看来这样做就足够了:

员工/index.blade.php

@foreach ($employees as $employee)
    <td>
       {{ $employee->manager->name }}
    </td>
@endforeach

【讨论】:

  • 谢谢你,你的假设是正确的,但没有奏效
  • @AlexG 这很奇怪。它会抛出任何错误吗?我还没有测试我的代码,但我可以看到它没有任何问题。
  • 这个工作就像一个魅力!令人困惑的部分是,你是如何查看“员工”的
  • 很高兴为您提供帮助。没看懂你的问题?您是指数组中的视图如何循环或关系如何加载?所以给你一个更好的答案
  • 另外,你在Employee.php 的belongsTo 中忘记了一个':',我去编辑它,但不让我编辑
【解决方案2】:

每个员工都有多个经理,所以没有$employees-&gt;manager这样的东西

试试这个:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-12-05
    • 1970-01-01
    • 2019-10-18
    • 2018-06-20
    • 2017-08-28
    • 2018-07-18
    相关资源
    最近更新 更多