2015-06-19 62 views
0

TLTR:Laravel:從相關模型使用範圍來篩選結果

如何使用範圍的方法從另一個(UserSubscriber)獲得從一個模型(用戶)集合?模型是一對一的關係。

更多:

我有兩個模型相關的一對之一:

第二種模式是隻針對部分用戶已經延長,具體的角色(用戶在這種情況下)

用戶模式:

class User extends \Sentinel\Models\User 
{ 
    public function subscriber() 
    {   
     return $this->hasOne('App\Models\UserSubscriber', 'user_id'); 
    }  
} 

UserExtended型號:

class UserSubscriber extends Model 
{ 
    public function user() 
    {   
     return $this->belongsTo('App\Models\User', 'user_id'); 
    }   

    public function scopeLangSubscribers($query, $langCode) 
    { 
     $query->where('languages_subscribed', 'LIKE', '%' . $langCode . '%'); 
    }  
} 

我們的目標是:

獲取使用範圍從UserSubscriber用戶的集合。

(無需重寫此範圍內的方法來用戶模型。)

當我堅持:

  $users = User::with(['subscriber' => function ($query) use ($lang) { 
       $query->langSubscribers($lang); 
      }])->get(); 

這將返回我的所有用戶的集合設置爲空一些「用戶」其中。

我試圖對其進行過濾,但:

  • 這可能不是最好的解決方案,因爲它檢索所有的人都從DB

     $users = $users->filter(function($item) { 
          return $item->subscriber != null; 
         }); 
    
  • 迭代後對用戶的整個大集合

'用戶' 是不是列,所以我不能做:

->whereNotNull('subscriber') 

我該如何做到這一點?

編輯:

或者,也許有一個集合(用戶)轉換爲另一種(用戶)第一afterretrieving這種方式,它可以做得非常aesy和清潔:

$usersSubscribers = UserSubscriber::langSubscribers($lang)->get(); 
+0

我不確定你想要完成什麼。爲什麼用戶只有一個用戶?當然,用戶應該有很多用戶? –

+0

用戶「有一個」用戶意味着:該用戶是用戶。由於不是每個用戶都是訂戶,因此這些附加信息存儲在附加表中。 –

回答

2

改爲使用whereHas

$users = User::with('subscriber')->whereHas('subscriber', function ($query) use ($lang) { 
    $query->langSubscribers($lang); 
})->get(); 
+0

是的,確切地說,泰克你。 (只是修正語法) –

+0

沒問題。對不起,語法錯誤。 – chanafdo