如何在 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 作为 idUser table.

中的用户

根据需要更新您的 hasOnehasMany 关系。 Laravel Documentation.

在您的 blade 模板中,您以

的身份访问您的 AccountManager
@foreach($sales->accountManager as $manager)
  Name: {{ $manager->name}}
@endforeach

Eloquent关系是你的朋友,https://laravel.com/docs/5.2/eloquent-relationships你可以轻松解决你的问题。

建议从视图中删除所有这些功能访问和控制,并将其放在其他地方。这对你来说是个好习惯,这样你就可以避免臭名昭著的 fat view.