2016-04-08 12 views
0

Ich verwende Logik wie dies an mehreren Stellen einen Benutzer und sein Profil abzurufen:Laravel 5.2 Erweiterung Eloquent Builder mit Wiederverwendbare Methoden

User::whereNotIn('id', $ids) 
    ->select(['id', 'email']) 
    ->with([ 
     'profile' => function ($query) { 
      $query->addSelect(['id', 'user_id', 'first_name', 'last_name']); 
     }, 
    ])->get(); 

Ich mag würde bestimmte Teile dieser in ein wiederverwendbares Verfahren machen für die Verkettung:

User::whereNotIn('id', $ids) 
    ->select(['id', 'email']) 
    ->withSimpleProfile() // use default columns 
    ->get(); 

und/oder

User::whereNotIn('id', $ids) 
    ->select(['id', 'email']) 
    ->withSimpleProfile(['id', 'user_id', 'first_name', 'last_name']) 
    ->get(); 

Wo withSimpleProfile würde Conta in etwas wie:

public function withSimpleProfile($columns) 
{ 
    $this->with([ 
     'profile' => function ($query) use ($columns) { 
      $query->addSelect(['id', 'user_id', 'first_name', 'last_name']); 
     }]); 

    return $this; 
} 

Gibt es eine Möglichkeit, dies zu tun?

UPDATE

Es scheint ein Verfahren macro im Builder zu sein, kann aber nicht herausfinden, wo/wie es verwendet werden könnte.

ALTERNATIV (unbefriedigende Lösung)

Typisch für wiederverwendbare Methoden, die ich eine UserRepository machen, aber das das ursprüngliche Codebeispiel für den Aufruf enthalten würde, aber ich mag benutzerdefinierte gekettet Methoden zur Abfrage hinzufügen zu vereinfachen wiederverwenden und nicht so eng gekoppelt. Scheint als der wahrscheinlichste Weg ist, meine eigene Illuminate/Eloquent/Builder.php zu erstellen und die Methode hinzuzufügen und irgendwie diesen Builder stattdessen zu verwenden? Aber, Laravel hat immer diese großartigen Möglichkeiten, das Ausstrecken einfacher zu machen, so scheint es.

Dies scheint jetzt zu arbeiten und weiterhin DI von UserRepository zu verwenden, aber aus irgendeinem Grund das Gefühl, es nicht ganz raffiniert:

User::whereNotIn('id', $ids) 
    ->select(['id', 'email']) 
    ->with($this->users->simpleProfile()) 
    ->get(); 

Wo die UserRepository :: simpleProfile zurück:

public function simpleProfile() { 

    return [ 
     'profile' => function ($query) { 
      $query->addSelect(['id', 'user_id', 'first_name', 'last_name']); 
     }, 
    ]; 
} 

Antwort

Verwandte Themen