我已经为我正在从事的项目创建了一个消息传递系统,并且似乎遇到了一些绊脚石。
我有以下表结构(为清楚起见省略了无关列)
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
如何使用 Eloquent 选择发送给发件人组具有写入权限的用户的所有消息?
edit
当然,::with
不会影响被拉取的消息,因为它只会延迟加载连接的表。