2013-09-27 5 views
6

Я создал систему обмена сообщениями для проекта, над которым я работаю, и, похоже, немного ударил камень преткновения.Laravel Eloquent отношения запросов

я следующие структуры таблицы (irrelevent столбцов опущены для ясности)

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

Как, с помощью красноречивых, я бы выбрать все сообщения, отправленные пользователем, где группа отправители имеет права на запись?

edit

Конечно, ::with не будет влиять на сообщения, которые втянуты, как это делает только ленивый загрузки соединяемых таблиц.

ответ

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 влияет только на загрузку данных.

4

Как насчет этого?

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

Вы пробовали фильтровать «из» для определенного group_id, например 2? Я думаю, что такой запрос должен правильно фильтровать ваши результаты.

+0

Проблема заключается в том, что не только люди в группе 2 могли бы писать сообщения, поэтому мне нужно было проверить, разрешены ли права на группу пользователей, содержащие разрешение 'write', а также' :: with', не влияет на основная модель, только модель с нетерпением (ly). –

Смежные вопросы