如何在刀片视图 laravel 5.6 中访问定义的关系
Posted
技术标签:
【中文标题】如何在刀片视图 laravel 5.6 中访问定义的关系【英文标题】:how to access the defined relation in blade view laravel 5.6 【发布时间】:2018-11-26 09:57:00 【问题描述】:我想在我的刀片视图中访问定义的关系,并在我的发票模型中显示我正在这样做
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
当我 dd $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" => "شسی"
【问题讨论】:
hasone
有错字,正确的是hasOne
函数名不区分大小写
那是我纠正的自动编译,但不是那不是问题仍然得到同样的错误
【参考方案1】:
get()
始终返回 Collection
,结果为 0...N。用这一行:
$clients = Invoice::with('users')->get();
$clients
将是 Collection
的 Invoice
对象。 users
属性在Collection
上不存在,它存在于Collection
内的每个Invoice
上。
确保您正在循环访问您的 $clients
集合并访问单个 Invoice
项目上的 users
。
注意:虽然这不是您的主要问题,但@Joshua 关于users
的注释是正确的。如果关系存在,hasOne
关系将返回 Model 实例,如果关系不存在,则返回 null
。我还建议将名称从users
更改为user
,并可能在关系不存在时添加一些保护:
@foreach($clients as $client)
...
<td> $client->user->title ?? 'No Title' </td>
...
@endforeach
【讨论】:
完整而清晰 :) 谢谢你为我节省了很多时间,我从中学到了,那是我试图在模型集合和单一模型之间理解的部分,谢谢 :) 还有 1 个问题是我可以在没有 get() 方法的情况下获得关系吗???$clients = Invoice::with('users');这样的做法正确吗? @Farshad 我不确定您要做什么(您显示的语法实际上不会运行查询)。您可能想发布另一个问题,详细说明您想要什么。把链接贴在这里,我醒来后看看,但在那之前可能会有其他人回答。 @Farshad 更有可能,为了清楚起见,您需要belongsTo
而不是hasOne
。
@patricus 你能帮我解决这个问题吗? ***.com/questions/50895038/…【参考方案2】:
删除first()
方法调用,你不需要这个,因为你已经通过这样做检索了users
:
$clients->users->title
请注意,如果您想使用first()
调用,您应该将查询更改为:
$client->users()->first()->title
注意users
和users()
在获取雄辩关系方面的区别。
另外,既然你们的关系是hasOne,你应该把users
改成user
以避免混淆。
【讨论】:
有没有使用 latest() 或其他任何东西来代替 first()?只是为了改变第一个【参考方案3】:您正在返回一个客户端集合,因此您需要遍历该集合。
您在称为 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
希望对您有所帮助。
请记住尝试使您的命名尽可能容易理解,是的,这个项目可能只是为了您的眼睛,但是对于从未见过它的人来说,这个简单的 sn-p 代码会变得晦涩难懂。
【讨论】:
感谢帮助的人,还有一个问题,hasmany 关系是否相同? 公共函数 products() return $this->hasMany('App\Product','id','product_id'); $products = Invoice::with('products')->get(); return view('admin.invoices.show', compact('invoice', $invoice),compact('clients',$clients))->with(compact('products',$products)); 当你定义你的关系时,我的朋友,只需执行:return $this->relationshipType(ModelName::class); 当您将数据发送到视图时,您需要做的只是一个紧凑型和变量名,例如return view('view', compact('invoices', 'clients', 'products');以上是关于如何在刀片视图 laravel 5.6 中访问定义的关系的主要内容,如果未能解决你的问题,请参考以下文章