2013-09-27 129 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)加载模型。 –