Я создаю базовую систему обмена сообщениями и нуждаюсь в запросе данных на сводной таблице. Соответствующие таблицы устанавливаются следующим образом:Запрос атрибутов поворота в 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, есть лучший способ достижения этой функции?
Вы ознакомились с http://laravel.com/docs/eloquent#soft-deleting Eloquent, который предоставит вам эту функцию. – SamV
Софт-удаление не удалит сообщение только для одного пользователя, мне все равно нужно будет определить, удалил ли этот пользователь сообщение и как таковое, к сожалению, потребуется соединение. –