2017-05-25 1 views
0

Derzeit habe ich zwei Tabellen; Benutzer und MitarbeiterBessere Möglichkeit zum Ausführen von Join-Abfrage in Laravel

Alle Benutzer Mitarbeiter sind aber nicht alle Mitarbeiter sind Benutzer,

Ich habe ein Modelle Users und Employee, die persönlichen Daten eines Benutzers seine jeweiligen Mitarbeiter Rekord gezogen werden.

Jetzt wollte ich alle Benutzer angezeigt und ich kann es mit User::all(); tun, sondern auch wollte ich auch ihre persönlichen Daten haben.

zur Zeit mache ich einen DB:: Anruf, um Tabelle in einer Funktion auf meinem Benutzermodell beizutreten.

Gibt es einen besseren Ansatz dafür?

+0

verwenden müssen Sind Ihre Modelle 'Employee' und' User' Eloquent? Wenn ja, beziehen sie sich auf eine redegewandte Beziehung? – Scopey

+0

Ich bin neu bei Laravel, ja sie sind eloquent, aber ich habe keine Eloquen-Beziehung, bitte schlagen Sie Ihre Lösung, wirklich schätzen – Roi

Antwort

2

Sie können es die Laravel Art und Weise tun - eifrig Last die Beziehung

$users = User::with('employee')->get(); 

Dies setzt voraus, dass Sie Ihre Beziehungen definiert haben, zumindest auf User Seite.

use Illuminate\Foundation\Auth\User as Authenticatable; 
use App\Employee; 

class User extends Authenticatable 
{ 
    // ... 

    public function employee() 
    { 
     return $this->hasOne(Employee::class, 'employee_no'); 
    } 
} 

FYI die Laravel Art und Weise bedeutet nicht unbedingt die schnellste oder die beste Art und Weise. Es ist normalerweise syntaktisch teurer/kurz und bequem.

Eager Laden einer Beziehung erfordert eine zusätzliche Abfrage. In Ihrem Fall werden zwei Abfragen unter der Haube ausgeführt und dann wird die Mitarbeitereigenschaft für jedes User Modell in einer Sammlung materialisiert.

So könnte Ihr Weg mit einem join und einem Hin-und Rückfahrt in die Datenbank am Ende des Tages mehr Leistung sein.

+0

Ich habe Fehler, die Suche nach 'user_employee_no', die nicht existiert, meine primären Schlüssel für beide Tabellen sind nur 'employee_no'. Wie würde ich Laravel stoppen, um Benutzer_Präfix vom Beziehungszugang hinzuzufügen – Roi

+0

Sie können Laravel sagen, welche fremden und lokalen Schlüssel in der Beziehung zu verwenden sind (2. und 3. Parameter entsprechend) 'return $ this-> hasOne (Angestellte :: Klasse, 'employee_no '); 'Siehe aktualisierte Antwort – peterm

+0

danke Sir für die Antwort und auch für den Einblick über beizutreten, ich plante, die' Benutzer' Tabelle an 'user_meta' Tabelle anzuschließen, die Zugangsbeschränkung, auch' Angestellte' zu ​​'employee_meta' für enthält zusätzliche optionale Infos – Roi

1

Sie sollten eine Beziehung herstellen. In diesem Fall Ihre Benutzer Ihre Mitarbeiter als solche

public function employee() 
{ 
    return $this->hasOne(Employee::class); 
} 

Mit Eloquent beziehen können, können Sie einfach definieren Methoden in Ihrem User Modell der Beziehung zuzugreifen und mit ihr geschehen.

public function role 
{ 
    return $this->employee->role; 
} 

Wenn jedoch Benutzer holen, möchten Sie Sie „eifrig Last“ Ihre Mitarbeiter Beziehung zu gewährleisten, so dass Sie nicht einzeln Mitarbeiter holen, wenn diese Methoden verwenden. Wenn Sie Ihre Benutzer holen:

User::with('employee')->all() 

Wenn Sie immer den Mitarbeiterdatensatz benötigen, können Sie gerne Last standardmäßig:

class User extends Authenticatable 
{ 
    protected $with = ['employee']; 
} 
1

Klingt wie Sie ein Eloquent One to One Relationship

<?php 

namespace App; 

use Illuminate\Database\Eloquent\Model; 

class User extends Model 
{ 
    public function employee() 
    { 
     return $this->hasOne('App\Employee'); 
    } 
} 
Verwandte Themen