2013-08-31 4 views
3

Я пытаюсь создать систему обмена сообщениями в CodeIgniter. У меня три таблицы, как показано ниже.Результаты поиска странного запроса Codeigniter

сообщения:

  • ID
  • номер_потока
  • message_id
  • Заголовок
  • сообщение
  • посланный

messages_thread:

  • ID
  • номер_потока

messages_participants:

  • идентификаторов
  • номер_потока
  • to_id
  • from_id
  • message_id

Я легко могу написать новое сообщение, и получатель может видеть, что сообщение получено.

Проблема возникает, когда есть ответ. После ответа результаты дублируются. Он показывает, что начальное сообщение было отправлено как из отправителя, так и из получателя и возвращает 4 строки вместо ожидаемых 2 строк. Может ли кто-нибудь сказать мне, где я ошибаюсь?

Вот моя модель:

function reply_to_thread(){ 
    //Generate random string for the ticket number 
    $rand = substr(str_shuffle(MD5(microtime())), 0, 11); 
    //Add the random string to the hash 
    $messageid = $rand; 
    $messageinsert = array(
     'message_id' => $messageid, 
     'subject' => $this->input->post('subject'), 
     'message' => $this->input->post('message'), 
     'thread_id' => $this->input->post('thread_id'), 

    ); 

    $participantsinsert = array(
     'message_id' => $messageid, 
     'from_id' => $this->input->post('from_id'), 
     'to_id' => $this->input->post('to_id'), 
     'thread_id' => $this->input->post('thread_id'), 
    ); 
    $this->db->insert('messages',$messageinsert); 
    $this->db->insert('messages_participants',$participantsinsert); 
} 

function view_thread($thread_id){ 
    $this->db->where('messages.thread_id', $thread_id); 
    $this->db->join('messages_participants', 'messages_participants.thread_id = messages.thread_id'); 
    $this->db->join('users', 'messages_participants.from_id = users.id'); 
    $result = $this->db->get('messages'); 
    var_dump($result); 
    return $result->result_array(); 
} 

Мой контроллер:

function check_messages(){ 
    $id = $this->session->userdata('id'); 
    $data['thread'] = $this->message_model->check_messages($id); 
    $this->load->view('messages/my_messages', $data); 

} 
function view_thread($thread_id){ 
    $data['thread'] = $this->message_model->view_thread($thread_id); 
    $this->load->view('messages/view_thread',$data); 
} 
function reply(){ 
    $this->message_model->reply_to_thread(); 
    redirect('messages/get_messages'); 
} 

мой взгляд нить:

<div class="well"> 
    <h3>View Messages</h3> 
    <?php foreach($thread as $threadfield):?> 

    <div class="message"> 
    <img class="avatar pull-left" src="<?php echo $threadfield['avatar'];?>"> 
    <div class="message-actions"> 
     <button class="btn btn-success" id="reply">Reply</button> 
    </div> 
    <p> 
     <strong> 
     From: <a href="profile.html"> Users id: <?php echo $threadfield['from_id'];?></a> 
     </strong> 
     <span class="badge badge-important">Unread</span><br> 
     <strong>Date:</strong> 
     <?php echo date('M j Y g:i A', strtotime($threadfield['sent']));?> 
    </p> 
    <p><strong>Subject:</strong> 
     <a href = "/messages/view_thread/<?php echo $threadfield['thread_id'];?>"> 
     <?php echo $threadfield['subject'];?> 
     </a> 
    </p> 
    <p><strong>Message:</strong> <?php echo $threadfield['message'];?></p> 
    <hr> 
    </div> 
    <?php endforeach; ?> 
</div> 
<div class="row-fluid" id="replyform" style="display: none"> 
    <div class="well"> 

    <h3>Reply to <?php echo $threadfield['username'];?>'s Message.</h3> 

    <?php echo form_open('messages/reply');?> 

    <input type="text" value="<?php echo $threadfield['thread_id'];?>" name="thread_id" id="thread_id"> 
    <input type="text" value="<?php echo $this->session->userdata('id');?>" name="from_id" id="from_id"> 
    <input type="text" value="<?php echo $threadfield['from_id'];?>" name="to_id" id="to_id"> 
    <input type="text" value="RE: <?php echo $threadfield['subject'];?>" name="subject" id="subject"> 
    <input type="text" placeholder="Message......." name="message" id="message"> 
    <button class="btn" type="submit">Submit Reply</button> 
    <?php echo form_close();?> 
    </div> 

EDIT:

Мне удалось решить эту проблему, но она создала новую. Я решил это, изменив соединения, поэтому сообщения, которые мы не привязали к пользователям, но участники были, теперь, хотя у меня нет способа показать правильные пользовательские данные для отображения начального нового сообщения, оно всегда будет показывать либо последние данные отправителей, либо последние данные получателя. Это зависит от того, установлен ли я для соединения from_id или to_id. Кто-нибудь знает, как я могу связать соединение пользователя с последним сообщением?

+2

Я просто добавить как комментарий, так как у меня нет времени прямо сейчас, чтобы пройти через весь ваш вопрос: У меня есть для обмена сообщениями LIB CodeIgniter здесь вы можете взглянуть на то, чтобы увидеть, как я решил такие вопросы: https://github.com/jrmadsen67/Mahana-Messaging-library-for-CodeIgniter – jmadsen

+0

@jmadsen привет, спасибо за ваш ответ, я начал использовать вашу библиотеку, но я столкнулся с проблемами, подобными этому , см. мой вопрос ниже. Может быть, вы могли бы пролить свет на меня? http://stackoverflow.com/questions/18488642/codigniter-linking-queries –

+0

ответил в другой теме – jmadsen

ответ

0

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

function view_thread($thread_id){ 
    $this->db->where('messages.thread_id', $thread_id); 
    $this->db->join('messages_participants', 'messages_participants.thread_id = messages.thread_id'); 
    $this->db->join('users', 'messages_participants.from_id = users.id'); 
    $this->db->order_by('field_name_goes_here');//put the name of field to set order by.. 
    $result = $this->db->get('messages'); 
    return $result->result_array(); 
} 
+0

В каком поле следует заказывать, чтобы включить данные из таблицы пользователей в соответствии с каждым отдельным сообщением? –

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