2013-06-10 4 views
3

Я разрабатываю приложение, в котором мне нужно, чтобы пользователи взаимодействовали друг с другом, используя чат-подобную систему.Разговор «Много-ко-многим»

С этой целью я хочу создать модель Conversation. Насколько я мог читать, я собираюсь использовать отношения «многие-ко-многим».

Имея следующие модели: Conversation, User и Message, я представил себе следующие таблицы:

разговоры: id | user1_id | user2_id - Я не уверен, если Laravel бы понять идентификаторы пользователей пронумерованы

сообщения: id | message | conversation_id | user_id

Будет ли это правильным способом? И будет ли он работать с таблицами user1_id и user2_id?

ответ

7

Я хотел бы предложить:

  • Многие ко многим: Пользователь < -> Разговор. User может иметь много Conversation S, A Conversation состоит из двух или более User сек
  • один-к-многие: Пользователь < -> Сообщений. A Message принадлежит к одному User. A User имеет много Message s
  • Один-ко-многим: Сообщение < -> Разговор. A Message принадлежит к одному Conversation. A Conversation имеет много Message s.

Это даст вам следующую структуру SQL (только атрибуты интересны для отношений, перечисленных):

users: id 
messages: id | user_id | conversation_id 
conversations: id 
conversations_users: conversation_id | user_id 

Подумайте о разговорах, как чаты, его в основном один общий сбор сообщений между несколькими пользователями.

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

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

    public function messages() 
    { 
     return $this->hasMany('Message'); // not as relevant, because these are all messages across conversations 
    } 
} 

class Message extends Eloquent 
{ 
    public function user() 
    { 
     return $this->belongsTo('User'); 
    } 

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

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

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

// Users conversations 
$conversations = User::find(1)->conversations; 

foreach($conversations as $conversation) 
{ 
    // All members of conversation 
    $members = $conversation->users; 

    // All messages of conversation 
    $messages = $conversation->messages; 
} 
+1

Является ли 'user_id' в' беседах' человеком, который инициировал разговор? –

+0

Это отлично. Спасибо! –

+0

удален 'user_id' из' conversations', спасибо – Felix

1

Ваш стол Сообщение должно выглядеть следующим образом:

MessageID   PK 
ConversationID FK 
UserID   FK 
ReplyToMessageID FK  <--- Track responses 
Message   String 

User1ID и User2ID является анти-модель. Что делать, если в разговоре участвуют три пользователя? Или четыре?

Имея ваши отношения в таблице сообщений, вы сохраняете свою информацию «много-ко-многим», но сохраняете связи между разговорами и сообщениями, а также пользователями и сообщениями от одного до многих.

Вам не нужны две пользовательские таблицы, только одна.

+0

Роберт, его сообщение таблица выглядит точно, как ваша. Это изменение должно произойти в таблице разговоров. Рассмотрим отношения «многие ко многим» с сводной таблицей между «беседой» и «пользователем». беседы: 'id', conversations_users:' convers_id | user_id'. – Felix

+0

@Felix: Смотрите мое редактирование. –

+0

Чтобы отслеживать ответы, не лучше ли иметь столбец «ReplyToMessageID»? – Felix

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