我想在我的刀片视图中访问已定义的关系,并在我的发票模型中显示我这样做
public function users() {
return $this->hasone('App\Client','id','client_id');
}
并在发票控制器中
public function show(Invoice $invoice)
{
$clients = Invoice::with('users')->get();
return view('admin.invoices.show', compact('invoice', $invoice),compact('clients',$clients));
}
最后在我看来我做了这个
<td>{{ $clients->users->first()->title }}</td>
但是当我尝试查看时会收到此错误
Property [users] does not exist on this collection instance
当我得到$ clients时,我得到的结果如下所示
#relations: array:1 [▼
"users" => Client {#309 ▼
#fillable: array:14 [▶]
#connection: "mysql"
#table: null
#primaryKey: "id"
#keyType: "int"
+incrementing: true
#with: []
#withCount: []
#perPage: 15
+exists: true
+wasRecentlyCreated: false
#attributes: array:17 [▼
"id" => 1
"title" => "شسی"
答案 0 :(得分:3)
get()
始终返回Collection
,结果为0 ... N.有了这条线:
$clients = Invoice::with('users')->get();
$clients
将是Collection
个Invoice
个对象。 users
上的Collection
属性不存在,Invoice
内的每个Collection
都存在该属性。
确保您循环浏览$clients
个收藏集并访问各个users
项目的Invoice
。
注意:虽然这不是你的主要问题,@ Joshua关于users
的说明是正确的。如果关系存在,hasOne
关系将返回Model实例,如果关系不存在,则返回null
。我还建议将名称从users
更改为user
,并为关系不存在时添加一些保护:
@foreach($clients as $client)
...
<td>{{ $client->user->title ?? 'No Title' }}</td>
...
@endforeach
答案 1 :(得分:1)
删除first()
方法调用,您不需要这样做,因为您通过执行以下操作检索了users
:
{{ $clients->users->title }}
请注意,如果您要使用first()
调用,则应更改查询:
{{ $client->users()->first()->title }}
注意获取雄辩关系时users
和users()
之间的区别。
此外,由于您的关系为hasOne,因此您应将users
更改为user
以避免混淆。
答案 2 :(得分:1)
您正在返回一组客户端,因此您需要遍历该集合。
您正在定义名为users的客户端模型上的hasOne关系。首先,作为一个hasOne关系,你应该恰当地命名它,在这种情况下只是用户。
您还可以更清晰地定义它:
public function user()
{
return $this->hasOne(User::class);
}
现在,您的第二个问题是如何尝试检索此关系。
假设您将一组客户传递给您的视图,例如:
public function clients()
{
$clients = Client::with('user')->get();
return view('view.view.view', compact('clients');
}
在您的刀片中,您现在需要遍历您的客户以获得他们的用户关系:
@foreach($users as $user)
{{ $client->user->user_column_name }}
@endforeach
希望有所帮助。
请记住尝试让你的命名尽可能容易理解,是的,这个项目可能只适合你的眼睛,但只是这个简单的代码片段变得模糊不清,因为那些从来没有见过它的人会发生什么事情。