2016-05-20 18 views
5

yüzden çok-çok ilişkisi, ben 3 rolleri ile User & Role modelleri var: John, Mike, James ve Larry: 4 kullanıcıları en diyor let ile super, admin ve moderator .belli Rolleri olmadan Birçok seçme Kullanıcıya Eloquent Birçok

JohnJames bir admin ve Larry bir moderator olduğu, Mikeadmin ve moderator rolü bulunmaktadır, bir super olup.

public function scopeDoesntHaveRoles($query, $roles = [], $column = 'id') { 
    return $query->whereDoesntHave('roles')->orWhereHas('roles', function ($q) use ($roles, $column) { 
     $q->whereNotIn($column, $roles); 
    }); 
} 

Ben super role sahip değildir kullanıcıları almak için User::doesntHaveRoles([1])->lists('name', 'id') diyoruz, çalışıyor ve getiri: Belirli roller yoktur görüntüleyen kullanıcılar için bu kapsam yarattı

{"2":"Mike","3":"James","4":"Larry"} 

Ama

: Ben o aslında iken admin rol User::doesntHaveRoles([2])->lists('name', 'id') yok kullanıcıları, evet James orada gösterilmez ama Mike çıktı listeyle çalışırken admin rolü vardır
{"1":"John","2":"Mike","4":"Larry"} 

Sanırım, Mike'un moderator rolü olduğu için, kapsamımda yanlış bir şey görüyor musunuz? ya da başka çözümleriniz var mı?

Teşekkür

Düzenleme: İşte benim Pivot şema

Schema::create('user_roles', function (Blueprint $table) { 
    $table->integer('user_id')->unsigned(); 
    $table->integer('role_id')->unsigned(); 

    $table->primary([ 
     'user_id', 'role_id' 
    ]); 
}); 

User modeli

public function roles() 
{ 
    return $this->belongsToMany(Role::class, 'user_roles'); 
} 

Role Modeli

public function users() 
{ 
    return $this->belongsToMany(User::class, 'user_roles'); 
} 
+0

Eğer 'roles' ve' users' arasındaki Pivot tablonun şema tarif edebilir gibi oluşturucu bir sorgu yaratacak sen uylaşımını tables.If bir ROLE_ID sütun üzerinde olmalıdır 'whereNotIn' yöntemini aramak istediğiniz. – shempignon

+0

@shempignon Sadece temel bir pivot tablo, düzenlenmiş yayına bakın. – Rifki

cevap

1

whereDoesntHave yerine whereNotIn kullanırım.

Verilen Birlikte bu rolü olmayan tüm kullanıcıların alabilirsiniz $role değişkeninde saklanan bir Role: Verilen bir role sahip kullanıcıların bütün kimlik dönecektir

/* @var Role $role */ 
User::whereNotIn(function('id', $query) use ($role) { 
    $query->select('user_id') 
     ->from('user_roles') 
     ->where('role_id', $role->id); 
}); 

iç sorguda. whereNotIn kullanmak, karşıt kullanıcı kümesini döndürür. folowing sorgu oluşturulacak:

select * 
from users 
where user_id not in (
    select user_id 
    from user_roles 
    where role_id = ? 
); 

Şimdi roller Collection alabilirsiniz $roles saklanmasını o rollerden birine sahip olmayan tüm kullanıcılar:

/* @var Collection|Role[] $roles */ 
User::whereNotIn(function('id', $query) use ($roles) { 
    $query->select('user_id') 
     ->from('user_roles') 
     ->whereIn('role_id', $roles->pluck('id'); 
}); 

iç seçme irade Koleksiyondaki rollerden birine sahip olan tüm kullanıcıların geri dönüş kimlikleri. whereNotIn ile karşıt sonucu tekrar elde edersiniz. Ayrıca $roles->pluck('id') yerine bir dizi rol-kimliği de kullanabilirsiniz.

select * 
from users 
where user_id not in (
    select user_id 
    from user_roles 
    where role_id in (?, ?, ..) 
); 
+0

Sonunda parlak bir çözüm buldum, teşekkürler @PaulSpiegel. – Rifki