gpt4 book ai didi

php - Laravel Eloquent 查询关系

转载 作者:可可西里 更新时间:2023-11-01 06:40:34 24 4
gpt4 key购买 nike

我为我正在从事的项目创建了一个消息系统,但似乎遇到了一些绊脚石。

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

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 选择发送给发件人组具有写入权限的用户的所有邮件?

编辑

当然,::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);

这正是我想要的。

如我的问题所述,::with 仅影响数据的加载。

关于php - Laravel Eloquent 查询关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19047315/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com