【问题标题】:How to safely access other users and other model's records inside Blade template如何在 Blade 模板中安全地访问其他用户和其他模型的记录
【发布时间】:2016-07-17 13:46:50
【问题描述】:

我的应用用户、销售和计划中有 3 个模型,当我为每个客户呈现销售时(由于存储),我只获得与该销售相关的其他用户和模型的 ID(如客户经理、所有者、计划) ,现在我正在尝试使用刀片内部的这些 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]);
}

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

@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”。

目前我通过在 Sale 模型类中添加公共静态函数(这是给用户的,对 Plan 模型也有相同的功能)解决了这个问题:

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

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

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

这是最安全、最好的方法吗?还是我在这里忽略了什么?

【问题讨论】:

  • 您是如何在销售模型中管理关系的?
  • 嗯,这可能是个问题,我没有建立关系,不知道如何获取它,因为每个销售模型记录都有 5 个不同的用户和一个计划模型 ID。 .

标签: laravel laravel-5.2 laravel-blade


【解决方案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-&gt;agents 将在User 表中为您提供agent_id 作为id 的用户。

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

从您的刀片模板中,您访问您的 AccountManager 作为

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

【讨论】:

  • 这是最接近的,但这种方式是在 User 表中搜索 account_manager_id,它应该根据 Sales 表中的 account_manager_id 搜索 id。
  • 好的,我刚刚添加了 'id' 例如现在它的 ('App\User', 'id', 'agent_id');所以它现在可以工作了。谢谢大佬!!!
  • 检查文档'return $this->hasMany('App\User', 'foreign_key', 'local_key');'。希望你能解决。
  • 大声笑,我们同时回答了同样的问题......无论如何,我将 hasMany 更改为 hasOne 并在刀片中不使用 foreach 的情况下返回它(因为每个销售只有一个这些 id)
  • @Dino 快乐编码 ;)
【解决方案2】:

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

它将打印所有用户的销售额和货币,然后是创建日期。 该示例考虑到,您的 User 模型具有 name 属性,而您的 Sale 模型在您的数据库中具有 amount、currency、created_at 和 customer_id 字段。

要反转操作,假设您有一笔交易并想知道是谁做的,只需简单地定义一个关系!

<?php

class Sale extends Eloquent {
    public function customer() {
        return $this->belongsTo(User::class, 'customer_id');
    }
}

希望有帮助!

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

    • 其他答案给了我解决方案,但您能否详细说明“胖视图”以便我避免它?
    • 基本上你需要记住,在编程的世界里,越少越好,如果你能用更少的努力解决一个问题,但仍然足够负责,那么最好的做法是越少越好。胖视图是指您在 MVC 范式中的视图有很多控制结构和功能,它们变得难以维护并与 M 和 C 对应物分离。 if else、function等控制结构最好用状态来表示。您可以将所有这些代码带到控制器或更负责的类中。
    猜你喜欢
    • 1970-01-01
    • 2010-10-26
    • 2015-10-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-01
    • 1970-01-01
    相关资源
    最近更新 更多