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

また、すべてのメッセージをユーザーに返します。

tl;dr

Eloquent を使用して、senders グループが書き込み権限を持つユーザーに送信されたすべてのメッセージを選択するにはどうすればよいですか?

edit

もちろん、::with結合されたテーブルの遅延ロードのみを行うため、プルされるメッセージには影響しません。

4

2 に答える 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、データのロードにのみ影響します。

于 2013-09-27T14:51:22.123 に答える
5

これはどう?

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

2 のような特定の group_id の「from」をフィルタリングしようとしましたか? このようなクエリは、結果を正しくフィルタリングする必要があると思います。

于 2013-09-27T14:00:24.073 に答える