我为我正在研究的项目创建了一个消息传递系统,似乎已经遇到了一些绊脚石.
我有以下表结构(为清楚起见省略了无关列)
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;博士
如何使用Eloquent选择发送给发件人组具有写权限的用户的所有邮件?
编辑
当然,:: with不会影响被拉取的消息,因为它只会延迟加载连接表.
我的解决方案是这样做:
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);
这正是我想要的.
正如我的问题所述::仅影响数据的加载.