2016-07-17 5 views
0

У меня есть 3 модели в моем приложении Пользователи, продажи и планы, когда я делаю продажи для каждого клиента (из-за хранения), я получаю только идентификаторы для других пользователей и моделей связанные с этой продажей (например, менеджер учетных записей, владелец, план), теперь я пытаюсь использовать внутреннее лезвие этого ID для получения имен или других строк на основе идентификатора и модели. Вот шоу функция:Как безопасно получить доступ к другим пользователям и другим записям модели внутри шаблона Blade

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».

В настоящее время я это решается путем добавления общественности статической функции (это для пользователей, имеют такую ​​же функцию в плане модели, а) в продажу модели класса:

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

И я использую его, как это Лезвие:

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

Действительно ли это самый безопасный и лучший способ сделать это? Или что-то я здесь не замечаю?

+0

Как вы управляли взаимоотношениями в модели продаж? –

+0

Ну, это может быть проблемой, у меня нет настроенных отношений, не знаю, как это получить, поскольку каждая запись модели продаж имеет 5 разных пользователей и один идентификатор модели плана ... – Dino

ответ

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 таблицы.

Обновите свои hasOne, hasMany отношения как ваша потребность. Laravel Documentation.

Из шаблона лезвия, ваш доступ к вашему AccountManager в

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

Это самый близкий, но таким образом он ищет account_manager_id внутри таблиц User и должен искать идентификатор на основе account_manager_id в таблице Sales. – Dino

+1

ОК, я просто добавил 'id', например, теперь его ('App \ User', 'id', 'agent_id'); поэтому он работает сейчас. Спасибо чувак!!! – Dino

+1

Проверьте документацию 'return $ this-> hasMany (' App \ User ',' foreign_key ',' local_key ');'. Надеюсь, вы сможете решить. –

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

пользователей-с-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

Eloquent отношения являются вашим другом, https://laravel.com/docs/5.2/eloquent-relationships, и вы можете решить вашу проблему легко.

Предложение состоит в том, чтобы удалить все эти функции доступа и управления из представления и поместить их в другое место. Это будет хорошей привычкой для вас, чтобы вы могли избежать печально известного жирного изображения.

+0

Другой ответ дал мне решение, но можете ли вы подробнее рассказать об этом «жирном представлении», чтобы я мог его избежать? – Dino

+1

В основном вам нужно помнить, что в мире программирования лучше, чем меньше в мире программирования, если вы можете решить проблему с меньшими усилиями, но все же достаточно ответственными, тем меньше будет лучшей практикой. Fat view - это когда ваш взгляд в парадигме MVC получил множество структур управления и функций, которые трудно поддерживать и отделять от M и C. Структура управления, такая как if else, и функция лучше представлять в виде состояния. И вы можете взять весь этот код в контроллер или класс, который будет более ответственным. –

Смежные вопросы