2013-09-27 128 views
6

我爲我正在開發的一個項目創建了一個消息傳遞系統,似乎遇到了一些絆腳石。Laravel雄辯的查詢關係

我有以下的表結構(爲清楚起見省略無關緊要列)

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(); 

這被髮送到當前登錄的消息在用戶在發件人組的訪問級別仍然使用戶能夠撰寫郵件(理論上),但它只是返回發送給用戶的所有郵件。

我還試圖特異性靶向基團(基團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(); 

您是否嘗試過篩選某個group_id的「from」,比如2? 我認爲像這樣的查詢應該正確地篩選你的結果。

+0

問題是,不僅組2中的人員能夠編寫消息,所以我需要檢查用戶組權限是否包含'write'權限,並且':: with'不會影響主要模型,只是渴望(ly)加載模型。 –