私が取り組んでいるプロジェクトのメッセージング システムを作成しましたが、ちょっとした障害にぶつかったようです。
次のテーブル構造があります(明確にするために無関係な列は省略されています)
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
結合されたテーブルの遅延ロードのみを行うため、プルされるメッセージには影響しません。