2013-09-27 22 views
6

Ich habe ein Messaging-System für ein Projekt erstellt, an dem ich arbeite und scheinen ein bisschen ein Stolperstein getroffen zu haben.Laravel Eloquent Abfragen Beziehungen

Ich habe die folgende Tabellenstrukturen (irrelevent Spalten der Übersichtlichkeit halber weggelassen)

messages 
------------------------- 
from_id to_id spam 

users 
------------------------- 
id group_id 

groups 
------------------------- 
id access_level 

die Zugriffsebene verwendet, um Berechtigungen bitweise

001 read 
010 write 
100 delete 

so lesen und zu schreiben, würde der Zugriffsebene sein ‚3 '

Benutzer können Berechtigungen vom Websiteadministrator widerrufen haben, also versuche ich, Nachrichten auszuwählen, die an Benutzer gesendet wurden, bei denen der Absender noch vorhanden ist Hat Schreibrechte.

meine Modelle sind in Benutzer als solche (wieder nur relevante Teile gezeigt)

class User extends Eloquent { 
    public function group() { 
     return $this->belongsTo('Group'); 
    } 
} 

class Message extends Eloquent { 
    public function to() { 
     return $this->belongsTo('User', 'to_id'); 
    } 
    public function from() { 
     return $this->belongsTo('User', 'from_id'); 
    } 
} 

ich versucht habe, die folgende

Message::with(['from' => function($query) 
{ 
    $query->with(['group' => function($_query) 
    { 
     $_query->where('access_level', '&', 2); 
    }]); 
}]) 
->where('to_id', Auth::user()->id) 
->get(); 

Diese bekommt die Nachrichten an den aktuell angemeldeten geschickt, wo die Einrichtung Die Zugriffsebene der Absendergruppe ermöglicht dem Benutzer weiterhin das Schreiben von Nachrichten (theoretisch), wobei jedoch einfach alle an den Benutzer gesendeten Nachrichten zurückgegeben werden.

I auch versucht haben Targeting spezifisch für die Gruppe (Gruppen 6 und 7 gesperrt werden und unbestätigte Konten):

Message::with(['from' => function($query) 
{ 
    $query->whereNotIn('group_id', [6,7]) 
}]) 
->where('to_id', Auth::user()->id) 
->get(); 

die auch alle Nachrichten an den Benutzer zurückgibt.

tl;dr

Wie Eloquent verwenden, würde ich alle Nachrichten auswählen, um einen Benutzer gesendet, wo der Absender Gruppe Schreibrechte hat?

edit

Natürlich ::with werden die Nachrichten nicht beeinflussen, die gezogen bekommen, da es nur ein träges Laden von verknüpften Tabellen der Fall ist.

Antwort

8

Meine Lösung war, dies zu tun:

Message::select(DB::raw("messages.*")) 
    ->join("users AS from", "from.id", "=", "from_id") 
    ->join("groups", "groups.id", "=", "from.group_id") 
    ->whereRaw("groups.access_level & 2 = 2") 
    ->where('to_id', '=', Auth::user()->id); 

Welche genau das tut, was ich wollte es.

Wie in meiner Frage ::with angegeben betrifft nur das Laden der Daten.

4

Wie wäre es damit?

Message::with(['from' => function($query){ 
       $query->where('group_id', '=', '2'); 
    }]) 
    ->where('to_id', Auth::user()->id) 
    ->get(); 

Haben Sie versucht, das "von" für eine bestimmte group_id wie 2 zu filtern? Ich denke, eine Abfrage wie diese sollte Ihre Ergebnisse richtig filtern.

+0

Das Problem ist, dass nicht nur Leute in Gruppe 2 in der Lage sind, Nachrichten zu schreiben, also musste ich prüfen, ob die Benutzergruppenberechtigungen die Berechtigung 'write' enthielten und auch' :: with' keinen Einfluss auf die Hauptmodell, nur das eifrig (ly) -geladene Modell. –

Verwandte Themen