Laravel Eloquent 查询关联关系

6

我创建了一个消息系统,用于我正在开发的项目,但目前似乎遇到了一些问题。

我有以下表结构(为了清晰起见省略了不相关的列)

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 不会影响被拉取的消息,因为它只对连接表进行惰性加载。

2个回答

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 只影响数据的加载。


5
这个怎么样?
 Message::with(['from' => function($query){
              $query->where('group_id', '=', '2');
    }])
    ->where('to_id', Auth::user()->id)
    ->get();

您尝试过为特定group_id(例如2)过滤“from”吗? 我认为像这样的查询应该可以正确地过滤您的结果。


问题在于,不仅第二组的人可以编写消息,因此我需要检查用户组权限是否包含“写入”权限,而且 ::with 不会影响主模型,只会影响预加载模型。 - Andrew Willis

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接