2010-04-02 4 views
2

Мне нужно получить данные из двух таблиц. первый - список событий, второй - список мест.codeigniter различает имена полей в таблицах JOINed

У меня есть поля с тем же именем в обеих таблицах: events.venue (который является идентификатором), а venues.venue - это название места, например «блюзовый бар». Таблицы могут быть объединены на events.venue = venues.id.

Отрывок из моей модели:

$this->db->select('events.*, venues.*'); 
     $this->db->join('venues', 'events.venue = venues.id'); 
     if ($date != 'all') 
     { 
      $this->db->where('date', $date); 
     } 

     if ($keyword) 
     { 
      $this->db->like('description', $keyword); 
      $this->db->or_like('band', $keyword); 
      $this->db->or_like('venue', $keyword); 
      $this->db->or_like('genre', $keyword); 
     } 

     $Q = $this->db->get('events'); 
     if ($Q->num_rows() > 0) 
     { 
      foreach ($Q->result() as $row) 
      { 
       $data[] = $row; 
      } 
     } 

     $Q->free_result(); 
     return $data; 

Отрывок из Вид:

foreach ($events as $row) { 
      echo "<p>{$row->band} ({$row->genre})<br />"; 
      echo "Playing at: {$row->venue}<br /></p>"; // echoes "blues bar" 
//more here... 
} 

2 Вопросы: 1) Почему $ row-> место эхо venues.venue, вместо событий. место?

B) Как я могу их отличить? например. Что делать, если я хочу повторить как events.venue, так и venues.venue? Возможно, я могу сделать что-то вроде «SELECT venues.venue as name_of_the_venue», но как это сделать, когда я уже выбрал *?

ответ

6

Быстрое исправление:

$this->db->select('events.col1 AS ev_col1, 
        events.col2 AS ev_col2, 
        venues.col1 AS ven_col1, 
        venues.col2 AS ven_col2); 

Где col1, col2 являются столбцы в таблицах. затем используйте

$row->ven_col1 

для доступа к значениям.

+0

это могло бы работать, хотя с очень большой таблицей мне нужно было бы перечислить ВСЕ поля. могу ли я сделать что-то вроде «выбрать все, но считать venues.venue как имя места»? – Patrick

+2

Почему вы не попробуете, $ this-> db-> select ('*, venues.venue AS имя_события') – Iraklis

+2

Ираклис - вы были быстрее меня! :) Я просто собирался опубликовать комментарий, чтобы сказать, что я пробовал это: $ this-> db-> select ('events. *, Venues. *, Events.venue AS place_id'); и это сработало! Я не совсем уверен, что это лучшая с точки зрения хорошей практики, но она работает! – Patrick

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