2016-04-08 52 views
0

我使用的邏輯是這樣的幾個地方檢索用戶和他們的個人資料:Laravel 5.2擴展雄辯Builder和可重複使用的方法

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

我想提出的這個特定部分爲可重複使用的方法對於鏈接:

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

和/或

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

withSimpleProfile將CONTA在類似的東西:

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

    return $this; 
} 

有沒有辦法做到這一點?

UPDATE

是否有似乎是在構建器的方法macro,但不能揣摩出/它如何被使用。

選擇(不令人滿意的解決方案)

通常用於可重複使用的方法,我做一個UserRepository,但會包含原來代碼示例用於調用,但我想自定義鏈接的方法添加到查詢簡化重用,而不是如此緊密耦合。似乎最可能的方法是創建我自己的Illuminate/Eloquent/Builder.php並添加該方法,並以某種方式使用此構建器?但是,Laravel總是有這些很好的方法來讓事情變得更容易。

這似乎對於現在的工作,並繼續使用UserRepository的DI,但由於某些原因,它不感到相當精緻:

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

凡UserRepository :: simpleProfile返回:

public function simpleProfile() { 

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

回答