我创建了一个消息系统,用于我正在开发的项目,但目前似乎遇到了一些问题。
我有以下表结构(为了清晰起见省略了不相关的列)
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();
这也会将所有消息返回给用户。
简而言之
如何使用Eloquent,选择所有发送给用户的消息,其中发送方组具有写权限?
编辑
当然,::with
不会影响被拉取的消息,因为它只对连接表进行惰性加载。
::with
不会影响主模型,只会影响预加载模型。 - Andrew Willis