微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

php – Laravel Eloquent查询关系

我为我正在研究的项目创建了一个消息传递系统,似乎已经遇到了一些绊脚石.

我有以下表结构(为清楚起见省略了无关列)

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);

这正是我想要的.

正如我的问题所述::仅影响数据的加载.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。