在 laravel 8 中显示名称而不是 ID

Display Name instead of ID in laravel 8

我有两个表:用户和组织。用户包含外键 organisation_id 引用组织。对于查看用户,它显示错误 'Trying to get 属性 'name' of non object.

用户控制器

 public function view($id)
 {
  $record = User::find($id);
  return view('user.view',compact('record'));
 }

User.php

public function getOrg()
{
return $this->belongsTo(Organisation::class);
}

View.blade.php

<tr>
 <th>Organisation</th>
 <td>{{ $record->organisation_id->name }}</td>
</tr>

尝试参考另一个问题和答案仍然无法解决

首先,您的 UserController 中没有任何错误。但是,请考虑使用 Implicit Route Model Binding 在您的 UserController 方法中自动获取您的用户作为参数 在您的其余代码正常工作后。

其次,您的 User.php 没有根据 Laravel 的约定定义关系,我认为这是问题的根源。相反,更喜欢以下内容:

public function organisation()
{
    return $this->belongsTo(Organisation::class);
}

organisation() 方法使用了一种“神奇”方法,允许您使用 view.blade.php 中的以下内容获取关系的完整 Eloquent 模型:

<tr>
    <th>Organisation</th>
    <td>{{ $record->organisation->name }}</td>
</tr>

您的代码因以下原因而中断:

  • $record->organization_id 是指数据库中的实际数字,而不是相关模型。要在您的示例中获取相关模型,您需要执行 $record->getOrg()。但是,出于上述原因,您应该重命名该方法以更好地利用 Laravel 的约定。
  • 此外,以 get...() 开头的方法被视为 访问器 数据库中未找到的其他模型属性。所以尽量避免将它们用于简单的关系。

如果您有任何问题,请告诉我。

User.php 中,您的方法名称应该是 oranisation 而不是 getOrg。 Laravel 在访问 $user->organisation 属性.

时在幕后调用此方法 organisation()
public function organisation()
{
    return $this->belongsTo(Organisation::class, 'organisation_id', 'id');
}

然后在 view.blade.php 中稍微调整一下:

<tr>
 <th>Organisation</th>
 <td>{{ $record->organisation->name }}</td>
</tr>

您已在查询中定义关系

public function view($id)
{
  $record = User::with('getOrg')->find($id)->first();
  return view('user.view',compact('record'));
}

在视图中

 <tr>
  <th>Organisation</th>
  <td>{{ $record->getOrg->name }}</td>
 </tr>

试试这个方法