2013-11-21 8 views
2

Я создаю базовую систему обмена сообщениями и нуждаюсь в запросе данных на сводной таблице. Соответствующие таблицы устанавливаются следующим образом:Запрос атрибутов поворота в Eloquent

| conversations | messages   | message_user | conversation_user | 
------------------------------------------------------------------------------ 
| id    | id    | message_id | conversation_id |   
| created_at  | conversation_id | user_id  | user_id   | 
| updated_at  | content   | sender  |      | 
| deleted_on  | created_at  | unread  |      | 
|     | updated_at  | deleted  |      | 
------------------------------------------------------------------------------ 

Просто, каждый разговор имеет пользователей, каждый пользователь имеет сообщений, каждое сообщение в разговоре. Таблица message_user представляет собой сводную таблицу, как и таблица conversaton_user.

мои модели устанавливаются следующим образом:

class Message extends Eloquent { 
    public $touches = ['conversation']; 

    public function conversation() { 
     return $this->hasOne('Conversation'); 
    } 

    public function user() { 
     return $this->belongsToMany('User')->withPivot(['sender', 'unread', 'deleted']); 
    } 

    public function session() { 
     return $this->hasOne('UserSession'); 
    } 
} 

class Conversation extends Eloquent { 

    public function users() { 
     return $this->belongsToMany('User'); 
    } 

    public function product() { 
     return $this->hasOne('Product'); 
    } 

    public function messages() { 
     return $this->hasMany('Message'); 
    } 
} 

class User extends Eloquent { 

    ... 

    public function conversations() { 
     return $this->belongsToMany('Conversation'); 
    } 

    public function messages() { 
     return $this->belongsToMany('Message'); 
    } 

    ... 

} 

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

foreach($conversation->users as $user) { 
    $message->users()->attach($user->id [ 
     'sender' => (Auth::user()->id === $user->id), 
     'unread' => (Auth::user()->id !== $user->id), 
     'deleted' => false, 
    ]); 
} 

, чтобы получить все разговоры пользователей Я делаю следующее:

$user = Auth::user(); 
foreach($user->conversations as $conversation) { 
    // get each message from the conversation 
    foreach($conversation->messages as $message) { 

    } 
} 

Моя проблема в том, что мне нужно запросить чтобы узнать, удалил ли пользователь сообщение, прежде чем принимать решение о том, показывать ли пользователю сообщение, поскольку удаление относится к каждому отдельному пользователю.

я мог бы сделать что-то подобное в моей модели разговора:

public function notDeletedMessage() { 
    return $this->messages() 
       ->join('message_user', 'message_user.message_id', '=', 'messages.id') 
       ->where('message_user.user_id', Auth::user()->id) 
       ->where('message_user.deleted', false); 
} 

Но это кажется немного Hacky, есть лучший способ достижения этой функции?

+1

Вы ознакомились с http://laravel.com/docs/eloquent#soft-deleting Eloquent, который предоставит вам эту функцию. – SamV

+0

Софт-удаление не удалит сообщение только для одного пользователя, мне все равно нужно будет определить, удалил ли этот пользователь сообщение и как таковое, к сожалению, потребуется соединение. –

ответ

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