2017-04-18 1 views
2

Mein aktuelles Projekt ist eine Art internes Telefonbuch. Ein Benutzer/Administrator kann nicht alle vorhandenen Kontakte sehen und bearbeiten, aber er kann die Erlaubnis erhalten, eine oder mehrere Abteilungen und/oder eine oder mehrere Firmen (mit allen verbundenen Abteilungen) zu bearbeiten.Laravel mehrere get() Anfragen - gibt es eine bessere Lösung?

  • Ein Benutzer gehört zu vielen Unternehmen und/oder Abteilungen.
  • Die Kontakte gehören zu einer Abteilung.
  • Eine Abteilung gehört einem Unternehmen.

Ich arbeite mit Laravel 5.4 und bekam die folgende Lösung. Die Ergebnisse sind korrekt, aber es ist auch effizient und sauber genug?

Benutzerklasse:

class User extends Authenticatable 
{ 
use Notifiable; 


/** 
* The companies that can be edited by the users. 
* 
* @return void 
*/ 

public function companies() 
{ 
    return $this->belongstoMany(Company::class); 
} 


/** 
* The departments that can be edited by the user. 
* 
* @return void 
*/ 

public function departments() 
{ 
    return $this->belongsToMany(Department::class); 
} 


/** 
* Get all contacts that can be edited by the user. 
* 
* @return void 
*/ 

public function allContacts() 
{ 
    // Open a new collection 
    $contacts = collect(); 

    // Get all contacts that belongs to all departments 
    $this->departments()->get()->each(function ($item) use (&$contacts) { 
     $contacts = $contacts->merge(Department::find($item->id)->contacts()->get()); 
    }); 

    // Get all contacts that belongs to all companies 
    $this->companies()->get()->each(function ($item) use (&$contacts) { 
     $contacts = $contacts->merge(Company::find($item->id)->contacts()->get()); 
    }); 

    // Return a unique collection 
    return $contacts->unique(); 
} 
} 

ContactsController:

/** 
* Display a listing of editables contacts. 
* 
* @return \Illuminate\Http\Response 
*/ 
public function index() 
{ 
    $contacts = Auth()->user()->allContacts(); 
    return view('contacts.index', compact('contacts')); 
} 

Ist die Mehrfachnutzung von get() und each() in den allContacts eine gute Art und Weise -Methode? Ich habe versucht, so viel eloquente und Sammelfunktionen wie möglich zu verwenden. Oder ist ein roher Sql die bessere Lösung?

Vielen Dank für Ihre Unterstützung und gute Ideen :)

Antwort

1

Ihre Lösung ist schlecht, weil der Code, den Sie viele Anfragen generieren verwenden wird und der Code selbst ist nicht lesbar.

Verwenden Sie stattdessen verschachtelte whereHas(). Ein Beispiel:

$contacts = Contact::whereHas('department.user', function($q) { 
    $q->where('id', auth()->id()); 
}) 
->orWhereHas('department.company', function($q) { 
    $q->whereHas('user', function($q) { 
     $q->where('id', auth()->id()); 
    }); 
}) 
->get(); 
+0

Es funktioniert nach dem Hinzufügen einiger user() -Methoden in den Unternehmens- und Abteilungsmodellen. Aber jetzt bekomme ich nicht die richtigen Ergebnisse. Ein Benutzer benötigt jetzt eine Erlaubnis für das Unternehmen UND die Abteilung. Mit der Erlaubnis des Unternehmens sollte der Benutzer in der Lage sein, alle Abteilungen des Unternehmens ohne ausdrückliche Genehmigung für die Abteilung zu bearbeiten. – Texx

+0

@Texx meinst du nach dem Hinzufügen von Beziehungen? Zweitens sollte "orWhereHas" sein. –

+0

Das "orWhereHas" -Veränderung macht den Trick! Jetzt geht es mir gut :) Vielen Dank. Ich fügte dem Unternehmen und dem Abteilungsmodell ein "aneignToMany" (User :: class) hinzu. – Texx

Verwandte Themen