【问题标题】:Laravel Eloquent querying relationshipsLaravel Eloquent 查询关系
【发布时间】:2013-10-03 13:08:34
【问题描述】:

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

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

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

edit

当然,::with 不会影响被拉取的消息,因为它只会延迟加载连接的表。

【问题讨论】:

    标签: php mysql laravel eloquent


    【解决方案1】:

    我的解决方案是这样做:

    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 中所述,只会影响数据的加载。

    【讨论】:

      【解决方案2】:

      这个怎么样?

       Message::with(['from' => function($query){
                    $query->where('group_id', '=', '2');
          }])
          ->where('to_id', Auth::user()->id)
          ->get();
      

      您是否尝试过过滤某个 group_id 的“来自”,例如 2? 我认为这样的查询应该正确过滤您的结果。

      【讨论】:

      • 问题是,不仅组2中的人可以写消息,所以我需要检查用户组权限是否包含write权限,并且::with没有' t 影响主模型,只是急切(ly)加载的模型。
      猜你喜欢
      • 2017-07-19
      • 2021-09-25
      • 2015-01-21
      • 2017-01-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-31
      • 2015-12-22
      相关资源
      最近更新 更多