Как я могу выбрать из нескольких таблиц в CodeIgniter - PullRequest
0 голосов
/ 11 августа 2010

У меня есть три таблицы: (для простоты я покажу только соответствующие поля)

Articles (id, title, text, author)
Comments (id, article_id, text, author)
Users (user_id, user_type, first_name, last_name, email, password)

В таблице articles, поскольку у автора может быть несколько статей, я храню толькоавтор user_id из таблицы users, и я делаю то же самое для таблицы comments.

Моя проблема заключается в том, что я запускаю запрос ActiveRecord в элементе article_model, чтобы получить все статьи вместе с соответствующими статьямикомментарии, а затем повторить автора на мой взгляд с $row->author, я получаю только user_id автора, который равен 1, 2, 3 и т. д. и т. д.

Как перейти в таблицу users (разныеТаблица) в том же запросе и получить фактические first_name и last_name авторов и вернуть это?

Вот мой код:

Контроллер:

$data['articles'] = $this->getArticles();
$this->load->view('articles_view', $data);

function getArticles() {
  $this->load->model('articles_model');
  $articles = $this->articles_model->getAllArticles();
  return $articles;
}

article_model:

function getAllArticles() {
  $this->db->where('id', $this->uri->segment(3));
  $query = $this->db->get('articles');
  return $query;
}

Articles_view:

<?php foreach($articles->result() as $row) { ?>
<?php echo $row->author ?>
<?php echo $row->text ?>
<?php } ?>

У меня есть тонна других полей, но это упрощенная версия для простоты.

Если я эховыше $row->author, я только собираюсь получить user_id.Мне нужно получить имя пользователя из таблицы users.Конечно, мне не нужно делать еще один отдельный вызов функции и передавать больше информации в представление.Любая помощь здесь будет принята с благодарностью и откроет мне мир:)

Ответы [ 2 ]

1 голос
/ 11 августа 2010

Попробуйте (или просто представьте себе):

Я предположил, что user_id из вашей таблицы users является внешним ключом таблицы articles и comments, поскольку вы сказали, что авторы икомментаторы user_id хранятся в users таблице.

На вашем контроллере:

$data['articles'] = $this->getArticles(); 
$this->load->view('articles_view', $data);

function getArticles() { 
   $this->load->model('articles_model'); 
   $articles = $this->articles_model->getArticlesById(); 
   return $articles; 
}

На вашей модели:

// this will get the article of a certain author   
function getArticlesById()
{
   $this->db->where('id', $this->uri->segment(3)); 
   $q = $this->db->get('articles'); 
   if($q->num_rows() > 0)
   {
       $q = $q->row_array();
       $result = $this->getCommentsAndAuthors($row);
       return $result;
   }
   return 0;
}

// this will get the comments of each articles of the author and the author of the comments
function getCommentsAndAuthors($row)
{
    $result = $data = array();

    $this->db->select('c.*, u.firstname, u.lastname');
    $this->db->from('users u');
    $this->db->where('u.id', $row['user_id']);
    $this->db->join('comments c', 'c.id = u.id');
    $q = $this->db->get();
    foreach($q->result_array() as $col)
    {
        $data[] = $col;
    }
    $result['article'] = $row;
    $result['comments'] = $data;
    return $result;
}

Я не уверен, работает ли он, но это идея.

0 голосов
/ 11 августа 2010

Я нашел подходящее мне решение, которое я опубликую и постараюсь объяснить.

Мой контроллер выглядит так:

function fullArticle()
{
    $data['article'] = $this->getArticleDetail();
   $data['comments'] = $this->getNewsTrendsComments();
   $this->load->view('inner_view', $data);
}

function getArticleDetail()
{
   $this->load->model('articles_model');
   $articles = $this->articles_model->getArticles();
   return $articles;
}

function getComments()
{
   $this->load->model('articles_model');
   $comments = $this->articles_model->getComments();
   return $comments;
}


articles_model:
function getArticles()
{
   $this->db->where('id', $this->uri->segment(3));
   $query = $this->db->get('articles');
   return $query;
}

function getComments()
{
   $this->db->select('*');
   $this->db->from('comments w');
   $this->db->where('article_id', $this->uri->segment(3));
   $this->db->join('users wc','w.author = wc.user_id');
   $data = $this->db->get();
   return $data;
}

Как видите, getCommentsФункция в моей модели была ключевой.Это заявление JOIN, которое обрабатывает то, что я пытался выполнить.Я знаю, что, возможно, есть более чистые и эффективные способы сделать это, комбинируя две функции, но как новичок я хотел, чтобы это было проще для понимания.

Надеюсь, это поможет другим.

...