2016-08-04 23 views
1

Ich bin ein bisschen fest.Laravel: Ein Benutzer kann viele Geräte haben, aber jedes Gerät gehört zu maximal einem Benutzer

Also ich habe 2 Modelle, User und Device. Ein Benutzer kann X-Geräte haben, aber jedes Gerät kann nur zu maximal 1 Benutzer gehören.

Ich habe die Beziehungen wie folgt definiert:

class Device extends Model 
{ 
    public function user() 
    { 
     return $this->hasOne('App\User'); 
    } 
} 

class User extends Authenticatable 
{ 
    public function devices() 
    { 
     return $this->hasMany('App\Device'); 
    } 
} 

Nun, ich für meine Geräte einen Überblick-View möchten.

class DeviceController extends Controller 
{ 
    public function showOverview() 
    { 
     $devices = Device::all(); 
     return view('devices.overview')->with('devices', $devices); 
    } 
} 

In dieser Ansicht ich alle meine Geräte foreach.

@foreach ($devices as $device) 
    <tr> 
     <td>{{ $device->id }}</td> 
     <td>{{ $device->serial }}</td> 
     <td>{{ $device->state }}</td> 
     <td><!-- Get user Name here by $device->user_id Foreign key --></td> 
     <td> 
      <a href="" class="btn btn-block btn-primary btn-sm"> 
       <i class="fa fa-user" aria-hidden="true"></i> Profile 
      </a> 
     </td> 
    </tr> 
@endforeach 

Dort, wo der Kommentar ich gehen möchte assoziiert den Benutzernamen erhalten. Der Fremdschlüssel wird als $device->user_id gespeichert und verweist auf die ID der Benutzertabelle. Wie kann ich den Namen dieses Benutzers erhalten?

Antwort

2

Zunächst einmal sollten Sie eifrig Beladung Benutzer für alle Geräte zusätzliche Datenbankabfrage für jedes Mal, wenn Sie im Zusammenhang Zugang zu vermeiden Benutzer Modell.

ersetzen

$devices = Device::all(); 

mit

$devices = Device::with('user')->get(); 

Zweitens, um ähnliche in der Vorlage zu tun Benutzer Objekt zuzugreifen nur folgendes:

<td>{{ $device->user->name }}</td> 
+0

Vielen Dank. Aber beim Zugriff auf meine Route bekomme ich diesen Fehler: 'Rufen Sie die undefinierte Methode auf Beleuchten \ Datenbank \ Query \ Builder :: all()' nach dem Ersetzen, wie Sie es geschrieben haben. – Scarwolf

+0

Ich habe die Antwort aktualisiert, sorry für den Tippfehler –

0
$device->user->name // or other properties of user 

In Device Modell

return $this->belongsTo("App\User"); 

hasOne verwendet werden soll, wenn der Fremdschlüssel nicht in der verweisenden Tabelle ist. In Ihrem Fall der Fremdschlüssel user_id in der referenzierenden Tabelle ist devices, daher ist dies eine belongsTo Beziehung

0

Sie haben die richtige Relation-Setup auf Ihrem Benutzermodell, jedoch die Umkehrung dieser Beziehung in Ihrem Gerätemodell sollte die belongsTo()-Methode anstelle der hasOne()-Methode verwenden.

class Device extends Model 
{ 
    public function user() 
    { 
     return $this->belongsTo(App\User::class); 
    } 
} 

Sie sollten dann in der Lage sein, den Namen des Benutzers für ein bestimmtes Gerät mit dem folgend in Blade-Vorlage zu holen.

{{ $device->user->name }} 

Wie Sie auch die Nutzungsverhältnis für jedes Modell den Zugriff, wie Sie über die Geräte Ergebnisse sind Looping, können Sie die Benutzer Beziehung zu eifrig Last wollen die Menge an Anfragen zu minimieren, um Ihre

Datenbank

$devices = Device::with('user')->get(); 

Sie können auch Geräte nur für den jeweiligen Benutzer abfragen

$user->devices