And*_*lis 6 php mysql laravel eloquent
我为我正在研究的项目创建了一个消息传递系统,似乎已经遇到了一些绊脚石.
我有以下表结构(为清楚起见省略了无关列)
messages
-------------------------
from_id to_id spam
users
-------------------------
id group_id
groups
-------------------------
id access_level
Run Code Online (Sandbox Code Playgroud)
访问级别使用按位权限
001 read
010 write
100 delete
Run Code Online (Sandbox Code Playgroud)
所以要读写,访问级别为'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');
}
}
Run Code Online (Sandbox Code Playgroud)
我尝试了以下内容
Message::with(['from' => function($query)
{
$query->with(['group' => function($_query)
{
$_query->where('access_level', '&', 2);
}]);
}])
->where('to_id', Auth::user()->id)
->get();
Run Code Online (Sandbox Code Playgroud)
这将获取发送给当前登录用户的消息,其中发件人组的访问级别仍然允许用户写入消息(理论上),但它只是返回发送给用户的所有消息.
我还试图专门针对该组(第6组和第7组是禁用和未经证实的帐户):
Message::with(['from' => function($query)
{
$query->whereNotIn('group_id', [6,7])
}])
->where('to_id', Auth::user()->id)
->get();
Run Code Online (Sandbox Code Playgroud)
它还将所有消息返回给用户.
tl;dr
如何使用Eloquent选择发送给发件人组具有写权限的用户的所有邮件?
edit
当然,::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);
Run Code Online (Sandbox Code Playgroud)
这正是我想要的.
如我的问题所述,::with仅影响数据的加载.
这个怎么样?
Message::with(['from' => function($query){
$query->where('group_id', '=', '2');
}])
->where('to_id', Auth::user()->id)
->get();
Run Code Online (Sandbox Code Playgroud)
您是否尝试过为某个group_id(例如2)过滤“ from”?我认为这样的查询应该正确过滤您的结果。
| 归档时间: |
|
| 查看次数: |
5681 次 |
| 最近记录: |