如何安全地访问Blade模板

时间:2016-07-17 13:46:51

标签: laravel laravel-5.2 laravel-blade

我的应用程序用户,销售和计划中有3个模型,当我为每个客户呈现销售时(由于存储)我只获得与该销售相关的其他用户和模型的ID(如客户经理,所有者,计划),现在我尝试使用这些ID内部刀片来获取基于ID和模型的名称或其他行。这是show函数:

public function show($id) {
$user = User::find($id);
$sales = Sale::where('customer_id', '=', $id)->get();
return view('profiles.customer', ['user' => $user, 'sales' => $sales]);
}

在刀片中,我获得了所有这些销售:

@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

因此,在每条记录中我都喜欢&#34; account_manager_id&#34;,&#34; agent_id&#34;,&#34; owner_id&#34;,&#34; plan_id&#34;。

目前我通过在Sale模型类中添加公共静态函数(这适用于用户,同样具有Plan模型的功能)来解决这个问题:

public static function getUser($id) {
    return User::where('id', $id)->first();
}

我在Blade中使用它是这样的:

Account manager: {{$sale->getUser($sale->account_mgr_id)->name}}

这是最安全,最好的方法吗?或者有一些我在这里可以忽略的东西?

3 个答案:

答案 0 :(得分:1)

我认为你可以使用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'));
}

users-with-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');
    }
}

希望有所帮助!

答案 1 :(得分:1)

您需要在销售模型中添加关系。

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用户提供。

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

从您的刀片模板中,您可以访问您的AccountManager

@foreach($sales->accountManager as $manager)
  Name: {{ $manager->name}}
@endforeach

答案 2 :(得分:1)

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

建议从视图中删除所有这些功能访问和控制,并将其放在其他位置。这对你来说是个好习惯,所以你可以避免臭名昭着的胖视图