2013-09-27 60 views
6

Tôi đã tạo một hệ thống nhắn tin cho một dự án mà tôi đang làm việc và dường như đã đánh một chút trở ngại.Laravel Eloquent truy vấn các mối quan hệ

Tôi đã cấu trúc bảng sau (cột irrelevent bỏ qua cho rõ ràng)

messages 
------------------------- 
from_id to_id spam 

users 
------------------------- 
id group_id 

groups 
------------------------- 
id access_level 

các cấp độ truy cập sử dụng quyền Bitwise

001 read 
010 write 
100 delete 

như vậy để đọc và viết, mức độ truy cập sẽ là '3 '

người dùng có thể bị quản trị viên trang web thu hồi quyền, vì vậy điều tôi đang cố gắng làm là chọn thư đã được gửi tới người dùng nơi người gửi vẫn đang có quyền ghi.

mô hình của tôi được thiết lập như vậy (một lần nữa chỉ phần có liên quan cho thấy)

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'); 
    } 
} 

Tôi đã thử những điều sau

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

này được các thông điệp gửi đến các hiện đang đăng nhập sử dụng nơi cấp độ truy cập của nhóm người gửi vẫn cho phép người dùng viết thư (theo lý thuyết) tuy nhiên nó chỉ đơn giản trả về tất cả các thư được gửi tới người dùng.

Tôi cũng đã cố gắng đặc biệt nhắm mục tiêu nhóm (nhóm 6 và 7 bị cấm và các tài khoản chưa được xác nhận):

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

mà cũng trả về tất cả các thông điệp cho người dùng.

tl;dr

thế nào, sử dụng hùng hồn, tôi sẽ chọn tất cả các tin nhắn được gửi cho một người dùng mà nhóm người gửi có quyền ghi?

edit

Tất nhiên, ::with sẽ không ảnh hưởng đến các thông điệp đó được kéo, vì nó chỉ làm bốc lười biếng của các bảng tham gia.

Trả lời

8

Giải pháp của tôi là để làm điều này:

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

nào thực hiện chính xác những gì tôi muốn nó.

Như đã nêu trong câu hỏi của tôi ::with chỉ ảnh hưởng đến việc tải dữ liệu.

4

Làm thế nào về điều này?

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

Bạn đã thử lọc "từ" cho một group_id nhất định, như 2? Tôi nghĩ rằng một truy vấn như thế này sẽ lọc kết quả của bạn một cách chính xác.

+0

Vấn đề là, không chỉ những người trong nhóm 2 mới có thể viết tin nhắn, vì vậy tôi cần kiểm tra xem quyền của nhóm người dùng có quyền 'write', và' :: with' không ảnh hưởng đến mô hình chính, chỉ là mô hình hời hợt (ly). –

Các vấn đề liên quan