2016-07-17 2 views
0

Ich habe 3 Modelle in meiner App Benutzer, Umsatz und Pläne, wenn ich Umsatz für jeden Kunden rendern (aufgrund der Speicherung) Ich bekomme nur IDs für andere Benutzer und Modelle Im Zusammenhang mit diesem Verkauf (wie Account Manager, Besitzer, Plan), jetzt versuche ich, diese IDs innerhalb Blade zu verwenden, um Namen oder andere Zeilen basierend auf ID und Modell zu erhalten. Hier ist die Show-Funktion:Wie sicher auf andere Benutzer und andere Modell-Datensätze innerhalb Blade-Vorlage zugreifen

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

Und Klinge ich alle diese Verkäufe wie:

@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 

Also in jeder Platte, die ich wie "account_manager_id" haben "agent_id", "owner_id", " plan_id ".

Zur Zeit habe ich dieses Problem gelöst durch öffentliche statische Funktion hinzugefügt (dies für den Anwender ist, haben die gleiche Funktion für Plan-Modell als auch) in Sale Modellklasse:

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

Und ich verwende es so in Blade:

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

Ist dies der sicherste und beste Weg, es zu tun? Oder gibt es etwas, das ich hier übersehen habe?

+0

Wie haben Sie die Beziehung im Verkaufsmodell verwaltet? –

+0

Nun, das ist vielleicht ein Problem, ich habe keine Beziehungen eingerichtet, wusste nicht ganz, wie man es bekommt, da jeder Verkaufsmodell Datensatz hat 5 verschiedene Benutzer und eine Plan-Modell-ID ... – Dino

Antwort

1

Sie müssen Beziehungen in Ihrem Verkaufsmodell hinzufügen.

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

Jetzt $sales->agents werden Sie mit agent_id als id in User Tabelle einen Benutzer geben.

Aktualisieren Sie Ihre hasOne, hasMany Beziehungen wie Sie brauchen. Laravel Documentation.

Von Ihrer Blade-Vorlage Ihres Zugang Ihres Accountmanager als

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

Dies ist die nächste aber Auf diese Weise wird in den Benutzertabellen nach account_manager_id gesucht, und es sollte nach id basierend auf account_manager_id in der Sales-Tabelle gesucht werden. – Dino

+1

OK, ich habe gerade 'ID' hinzugefügt, zum Beispiel jetzt seine ('App \ User', 'ID', 'Agent_ID'); So funktioniert es jetzt. Danke, Mann!!! – Dino

+1

Überprüfen Sie die Dokumentation 'return $ this-> hasMany (' App \ User ',' Foreign_key ',' local_key ');'. Ich hoffe, du wirst es lösen können. –

1

Ich denke, Sie könnten Eloquent relationships verwenden. Unter Ihrem Beispiel sollten Sie Beziehung in Ihrem User-Modell definieren:

<?php 

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

Dann, wenn Sie erhalten müssen Verkäufe dieses Benutzers (Einträge, die über customer_id Spalt beziehen), nur einfach tun

<?php 

$user = User::find($id); 
$sales = $user->sales; 

Das ist sehr lustig, wenn, wenn Sie Liste der Benutzer zu drucken, die Verkäufe, zum Beispiel

<?php 

public function showUsersWithSales() { 
    $users = User::with('sales')->get(); 

    return view('users-with-sales', compact('users')); 
} 

Benutzer-mit-sales.blade.php Beispiel:

Es würde alle Benutzer mit ihrem Verkaufsbetrag und Währung, gefolgt von Datum, wenn es erstellt wurde, drucken. Dieses Beispiel berücksichtigt, dass Ihr Benutzermodell über ein name-Attribut verfügt und Ihr Verkaufsmodell die Felder betrag, Währung, created_at und customer_id in Ihrer Datenbank hat.

Um die Aktion umzukehren, sagen Sie, dass Sie einen Verkauf haben und wissen wollen, wer es gemacht hat, definieren Sie einfach eine Beziehung!

<?php 

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

Hoffe, dass hilft!

1

Eloquent Beziehung ist dein Freund, https://laravel.com/docs/5.2/eloquent-relationships und Sie können Ihr Problem leicht lösen.

Vorschlag ist, alle diese Funktionen Zugriff und Kontrolle aus der Sicht zu entfernen und es woanders zu setzen. Dies wird eine gute Gewohnheit für Sie sein, so dass Sie die berüchtigte Fett Sicht vermeiden können.

+0

Andere Antwort gab mir eine Lösung, aber können Sie mehr über diese "fette Ansicht" ausarbeiten, damit ich sie vermeiden kann? – Dino

+1

Grundsätzlich müssen Sie sich daran erinnern, dass weniger ist besser in der Welt der Programmierung, wenn Sie ein Problem mit weniger Aufwand zu lösen, aber immer noch verantwortlich genug, desto weniger ist die beste Praxis. Fat Sicht ist, wenn Ihr Blick in MVC-Paradigma viel Kontrolle Struktur und Funktion, die es schwer zu pflegen und losgelöst von M und C Gegenstück bekommen hat. Kontrollstruktur wie wenn sonst, und Funktion ist besser als Zustand dargestellt werden. Und Sie können den gesamten Code zu dem Controller oder der Klasse, die verantwortlich ist, nehmen. –

Verwandte Themen