【问题标题】:Display Name instead of ID in laravel 8在 laravel 8 中显示名称而不是 ID
【发布时间】:2021-12-27 04:34:16
【问题描述】:

我有两个表:用户和组织。用户包含外键 organization_id 引用组织。对于查看用户,它显示错误“尝试获取非对象的属性“名称”。

用户控制器

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

用户.php

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

查看.blade.php

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

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

【问题讨论】:

    标签: laravel eloquent laravel-8 php-7.4


    【解决方案1】:

    您已经在查询中定义了关系

    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>
    

    试试这个方法

    【讨论】:

    • 它显示错误..试图获取非对象的属性“名称”.. getOrg 方法不适合与本主题中所说的其他模型建立关系
    • 你能在控制器中使用 dd($record) 获取查询中的数据吗
    【解决方案2】:

    User.php 中,您的方法名称应为oranisation 而不是getOrg。 Laravel 在访问 $user-&gt;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>
    

    【讨论】:

      【解决方案3】:

      首先,您的 UserController 中没有任何错误。但是,请考虑使用 Implicit Route Model Binding 自动获取您的 User 作为 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...() 开头的方法被认为是数据库中未找到的其他模型属性的访问器。所以尽量避免将它们用于简单的关系。

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

      【讨论】:

      • 如果你不介意的话,我在哪里可以知道使用“魔法”方法的方法的文档?
      猜你喜欢
      • 2021-08-26
      • 1970-01-01
      • 1970-01-01
      • 2021-01-18
      • 2015-03-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-12-28
      相关资源
      最近更新 更多