【问题标题】:Laravel relationship hasMany not workingLaravel 关系有很多不起作用
【发布时间】:2018-11-25 01:36:17
【问题描述】:

我想通过在存储用户 ID 的“finished_by”列中找到用户名来打印用户名。但我得到这个错误:

试图获取非对象的属性“名称”

库存模型有finished_by,它有用户ID。

这是我的blade.php

@foreach($inventories as $inventory)
    <tr>
      <td>{{$inventory['id']}}</td>
      <td>{{$inventory->user->name}}</td>   
    </tr>
@enforeach

和我的索引方法

$company_id = Auth::user()->company_id;
$inventories = Inventory::where('company_id',$company_id)->get();

return view('inventories', compact('inventories', 'companies'));

还有我的关系

Inventory.php

public function users(){
    return $this->belongsTo(User::class, 'finished_by');
}

用户.php

public function inventories(){
    return $this->hasMany(Inventory::class, 'finished_by');
}

【问题讨论】:

  • 更改为{{$inventory-&gt;users-&gt;name}}
  • 没有改变,我有同样的错误。
  • 在此处显示您的表架构

标签: laravel error-handling relationships


【解决方案1】:

首先改变你们的关系

Inventory.php

public function user(){
    return $this->belongsTo("App\User", 'finished_by');
}

用户.php

public function inventories(){
    return $this->hasMany("App\Inventory", 'finished_by');
}

需要在预加载中添加user关系

$inventories = Inventory::where('company_id',$company_id)->with('user')->get();

现在模板渲染

@foreach($inventories as $inventory)
    <tr>
        <td>{{$inventory->id}}</td>
        <td>
           @if($inventory->user)
              {{$inventory->user->name}}
           @else
              'No User'
           @endif
        </td>   
    </tr>
@enforeach

【讨论】:

  • 改变了一切,还是一样
  • 你有那个finished_by字段的用户吗,检查一次
  • @NemanjaZolak 代码没有任何问题。对于您的$inventory 之一有空用户,这就是您收到该错误的原因。只需在那里添加一张支票@if($inventory-&gt;user) 然后只打印名称
  • 是的,这就是问题所在,在我输入@if 语句后它就可以工作了,谢谢!
【解决方案2】:

我不知道你有哪些字段,但测试一下这段代码:

@foreach($inventories as $inventory)
    <tr>
        <td>id : {{$inventory['id']}}</td>
        <td>name : {{$inventory->users->toArray()['name']}}</td>
    </tr>
@endforeach

【讨论】:

  • 进行这些更改后出现此错误Call to a member function toArray() on null
  • 我把@if 语句和它的工作。谢谢,你能解释一下为什么它必须使用 toArray() 吗?
  • 是的,使用@IF,可以防止错误发生。为了简单起见,我使用了toArray,并将输出放入一个数组中。
【解决方案3】:

这是因为您在 Inventory 模型中定义了 users,但您在刀片文件中调用了 user,因此您必须将函数更改为:

public function user(){
    return $this->belongsTo(User::class, 'finished_by');
}

【讨论】:

    【解决方案4】:

    更新控制器代码//需要添加关系

    $inventories = Inventory::where('company_id',$company_id)->with('user')->get();
    

    【讨论】:

      猜你喜欢
      • 2018-12-09
      • 2019-07-22
      • 1970-01-01
      • 2014-07-10
      • 2021-12-08
      • 2015-08-05
      • 2016-10-12
      • 2015-03-04
      相关资源
      最近更新 更多