如何在 Blade 模板中安全访问其他用户和其他模型的记录
How to safely access other users and other model's records inside Blade template
我的应用用户、销售和计划中有 3 个模型,当我为每个客户呈现销售时(由于存储),我只获得其他用户的 ID 和与该销售相关的模型(如客户经理、所有者、计划),现在我正在尝试使用 blade 内的那些 ID 来获取名称或基于 ID 和模型的其他行。这是显示功能:
public function show($id) {
$user = User::find($id);
$sales = Sale::where('customer_id', '=', $id)->get();
return view('profiles.customer', ['user' => $user, 'sales' => $sales]);
}
在 blade 中,我获得了所有这些销售额:
@foreach ($sales as $sale)
<li>
<i class="fa fa-home bg-blue"></i>
<div class="timeline-item">
<span class="time"><i class="fa fa-clock-o"></i> {{$sale->created_at->format('g:ia, M jS Y')}}</span>
<h3 class="timeline-header"><a href="#">{{$user->name}}</a> became a customer</h3>
<div class="timeline-body">
<p>Date: {{$sale->sold_date}}</p>
<p>Price: {{$sale->sale_price}}</p>
</div>
</div>
</li>
@endforeach
所以在每条记录中我都有 "account_manager_id"、"agent_id"、"owner_id"、"plan_id"。
目前我通过在销售模型 class:
中添加 public 静态函数(这是针对用户的,对计划模型也有相同的函数)解决了这个问题
public static function getUser($id) {
return User::where('id', $id)->first();
}
我在 Blade 中这样使用它:
Account manager: {{$sale->getUser($sale->account_mgr_id)->name}}
这是最安全、最好的方法吗?或者我在这里忽略了什么?
我想你可以使用 Eloquent relationships。以你的例子为例,你应该在你的用户模型中定义关系:
<?php
class User extends Eloquent {
public function sales() {
return $this->hasMany(Sale::class, 'customer_id');
}
}
然后,只要您需要获得该用户的销售额(通过 customer_id 列关联的条目),只需执行
<?php
$user = User::find($id);
$sales = $user->sales;
当您必须打印有销售的用户列表时,这非常有趣,例如
<?php
public function showUsersWithSales() {
$users = User::with('sales')->get();
return view('users-with-sales', compact('users'));
}
用户-sales.blade.php 示例:
@foreach ($users as $user)
User: {{ $user->name }}<br>
Sales:<br>
@foreach ($user->sales as $sale)
{{ $sale->amount }} {{ $sale->currency }} @ {{ $sale->created_at }}<br>
@endforeach
<hr>
@endforeach
它将打印所有用户的销售金额和货币,然后是创建日期。
此示例考虑到您的用户模型具有名称属性,而您的销售模型在数据库中具有金额、货币、created_at 和 customer_id 字段。
要反转操作,假设您有一次销售并且想知道是谁做的,只需定义一个关系即可!
<?php
class Sale extends Eloquent {
public function customer() {
return $this->belongsTo(User::class, 'customer_id');
}
}
希望对您有所帮助!
您需要在销售模型中添加关系。
class Sales extends Eloquent {
.....
.....
public function accountManager() {
return $this->hasMany('App\User', 'account_manager_id');
}
public function agents() {
return $this->hasMany('App\User', 'agent_id');
}
public function owner() {
return $this->hasOne('App\User', 'owner_id');
}
}
现在 $sales->agents
将为您提供 agent_id
作为 id
在 User
table.
中的用户
根据需要更新您的 hasOne
、hasMany
关系。 Laravel Documentation.
在您的 blade 模板中,您以
的身份访问您的 AccountManager
@foreach($sales->accountManager as $manager)
Name: {{ $manager->name}}
@endforeach
Eloquent关系是你的朋友,https://laravel.com/docs/5.2/eloquent-relationships你可以轻松解决你的问题。
建议从视图中删除所有这些功能访问和控制,并将其放在其他地方。这对你来说是个好习惯,这样你就可以避免臭名昭著的 fat view.
我的应用用户、销售和计划中有 3 个模型,当我为每个客户呈现销售时(由于存储),我只获得其他用户的 ID 和与该销售相关的模型(如客户经理、所有者、计划),现在我正在尝试使用 blade 内的那些 ID 来获取名称或基于 ID 和模型的其他行。这是显示功能:
public function show($id) {
$user = User::find($id);
$sales = Sale::where('customer_id', '=', $id)->get();
return view('profiles.customer', ['user' => $user, 'sales' => $sales]);
}
在 blade 中,我获得了所有这些销售额:
@foreach ($sales as $sale)
<li>
<i class="fa fa-home bg-blue"></i>
<div class="timeline-item">
<span class="time"><i class="fa fa-clock-o"></i> {{$sale->created_at->format('g:ia, M jS Y')}}</span>
<h3 class="timeline-header"><a href="#">{{$user->name}}</a> became a customer</h3>
<div class="timeline-body">
<p>Date: {{$sale->sold_date}}</p>
<p>Price: {{$sale->sale_price}}</p>
</div>
</div>
</li>
@endforeach
所以在每条记录中我都有 "account_manager_id"、"agent_id"、"owner_id"、"plan_id"。
目前我通过在销售模型 class:
中添加 public 静态函数(这是针对用户的,对计划模型也有相同的函数)解决了这个问题public static function getUser($id) {
return User::where('id', $id)->first();
}
我在 Blade 中这样使用它:
Account manager: {{$sale->getUser($sale->account_mgr_id)->name}}
这是最安全、最好的方法吗?或者我在这里忽略了什么?
我想你可以使用 Eloquent relationships。以你的例子为例,你应该在你的用户模型中定义关系:
<?php
class User extends Eloquent {
public function sales() {
return $this->hasMany(Sale::class, 'customer_id');
}
}
然后,只要您需要获得该用户的销售额(通过 customer_id 列关联的条目),只需执行
<?php
$user = User::find($id);
$sales = $user->sales;
当您必须打印有销售的用户列表时,这非常有趣,例如
<?php
public function showUsersWithSales() {
$users = User::with('sales')->get();
return view('users-with-sales', compact('users'));
}
用户-sales.blade.php 示例:
@foreach ($users as $user)
User: {{ $user->name }}<br>
Sales:<br>
@foreach ($user->sales as $sale)
{{ $sale->amount }} {{ $sale->currency }} @ {{ $sale->created_at }}<br>
@endforeach
<hr>
@endforeach
它将打印所有用户的销售金额和货币,然后是创建日期。 此示例考虑到您的用户模型具有名称属性,而您的销售模型在数据库中具有金额、货币、created_at 和 customer_id 字段。
要反转操作,假设您有一次销售并且想知道是谁做的,只需定义一个关系即可!
<?php
class Sale extends Eloquent {
public function customer() {
return $this->belongsTo(User::class, 'customer_id');
}
}
希望对您有所帮助!
您需要在销售模型中添加关系。
class Sales extends Eloquent {
.....
.....
public function accountManager() {
return $this->hasMany('App\User', 'account_manager_id');
}
public function agents() {
return $this->hasMany('App\User', 'agent_id');
}
public function owner() {
return $this->hasOne('App\User', 'owner_id');
}
}
现在 $sales->agents
将为您提供 agent_id
作为 id
在 User
table.
根据需要更新您的 hasOne
、hasMany
关系。 Laravel Documentation.
在您的 blade 模板中,您以
的身份访问您的 AccountManager@foreach($sales->accountManager as $manager)
Name: {{ $manager->name}}
@endforeach
Eloquent关系是你的朋友,https://laravel.com/docs/5.2/eloquent-relationships你可以轻松解决你的问题。
建议从视图中删除所有这些功能访问和控制,并将其放在其他地方。这对你来说是个好习惯,这样你就可以避免臭名昭著的 fat view.