Laravel:使用相关模型的范围来过滤结果

时间:2015-06-19 09:27:10

标签: laravel eloquent laravel-5

TLTR:

如何使用另一个模型(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();

这会向我返回所有用户'订阅者'其中一些设置为null。

我试图过滤它们,但是:

  • 这可能不是最好的解决方案,因为它在从DB中检索所有用户之后迭代整个大量用户

            $users = $users->filter(function($item) {
                return $item->subscriber != null;
            }); 
    

'订户'不是专栏,所以我不能这样做:

->whereNotNull('subscriber')

我该如何做到这一点?

修改

或者,也许有一种方法可以在首先完成这一过程后将一个(订阅者)集合转换为另一个集合(用户),这可以非常简洁地完成:

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

1 个答案:

答案 0 :(得分:3)

改为使用Event MyEvent() Public Sub DoWork() RaiseEvent MyEvent End Sub

Private WithEvents cl As Class1

Private Sub cl_MyEvent()
    Call Err.Raise(123, , "ErrorInClass")
End Sub

Private Sub Class_Initialize()
    Set cl = New Class1
End Sub

Public Sub DoWork()
    cl.DoWork
End Sub