2013-09-27 18 views
6

私が取り組んでいるプロジェクトのためのメッセージングシステムを作成しましたが、ちょっとした障害に遭ったようです。Laravel Eloquent querying relationships

は私が

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

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

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

アクセスレベルが

ので
001 read 
010 write 
100 delete 

読み書きするビット単位のアクセス権を以下のテーブル構造(明確にするために省略無関係の列)を使用している、アクセスレベルが3」になります'

ユーザーはサイト管理者によって権限が取り消される可能性があります。そのため、送信者がまだ送信していないユーザーに送信されたメッセージを選択することです書き込み権限を持っています。

私のモデルは、私が試してみました

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'); 
    } 
} 

等(図示再び関連部分のみ)として設定されている

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

を次これは、ユーザーに現在ログインに送信されたメッセージを取得する場所送信者グループのアクセスレベルでは、ユーザーはメッセージを(理論的に)書くことができますが、ユーザーに送信されたすべてのメッセージを返すだけです。

Iはまた、具体的にグループ(グループ6および7は禁止と未確認のアカウントである)を標的と試みた:

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

、ユーザにメッセージのすべてを返します。雄弁を使用して

tl;dr

どのように、私は、送信者グループが書き込み権限を持つユーザーに送信されるすべてのメッセージを選択するのでしょうか?もちろん

edit

それだけで結合されたテーブルの遅延ロードがそうであるように、::withは、引っ張られますメッセージには影響しません。

答えて

8

私のソリューションは、これを実行することでした。

私はそれが欲しかったまさにん
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); 

私の質問::withに記載されているように、データの読み込みにのみ影響します。

4

これはいかがですか?

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

2のような特定のgroup_idの "from"をフィルタリングしてみましたか? このようなクエリは、結果を正しくフィルタリングする必要があると思います。

+0

問題は、グループ2のユーザーだけでなく、メッセージを書き込むことができるだけでなく、ユーザーグループのアクセス許可に 'write'アクセス許可が含まれているかどうかを確認する必要があり、' :: 'メインモデル、ただ熱心なモデルです。 –

関連する問題