2010-08-11 8 views
0

J'ai trois tables: (pour faire simple, je vais montrer que les domaines concernés)Comment puis-je sélectionner à partir de plusieurs tables dans CodeIgniter

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

Dans le tableau articles, parce qu'un auteur peut avoir plusieurs articles , Je ne stocke que user_id de l'auteur de la table users, et je fais la même chose pour la table comments. Mon problème est quand j'exécute une requête ActiveRecord dans les articles_model pour obtenir tous les articles avec les articles associés commentaires, et puis écho l'auteur à mon avis avec $row->author, je reçois seulement l'user_id de l'auteur qui est 1, 2, 3, etc etc

Comment puis-je aller dans le tableau users (table différente) dans la même requête et obtenir les auteurs réels first_name et last_name et le retourner?

Voici mon code:

Controller:

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

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

articles_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 } ?> 

J'ai une tonne d'autres domaines, mais c'est un ex version très dépouillée pour la simplicité.

Si je fais écho au $row->author ci-dessus, je vais seulement obtenir le user_id. J'ai besoin d'obtenir le nom de l'utilisateur de la table users à la place. Sûrement je ne dois pas faire un autre appel de fonction séparé et passer plus d'informations dans la vue. Toute aide ici serait grandement apprécié et serait en fait d'ouvrir un monde pour moi :)

+0

Je ne peux pas parler de CI spécifiquement mais normalement il y a des méthodes 'join' sur votre classe db ... ou parfois des méthodes de jointure spécifiques sur les modèles comme' getWith' ou 'findWith'. – prodigitalson

+0

Est-ce que le 'auteur' dans les articles et les commentaires table est la clé étrangère de la table des utilisateurs? – Manie

Répondre

1

Essayez cette (ou juste une idée):

Je suppose que user_id de votre table est users clé étrangère de articles et comments table puisque vous avez dit que les auteurs et les commentateurs user_id sont stockés dans users tableau.

Sur votre contrôleur:

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

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

Sur votre modèle:

// 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; 
} 

Je ne sais pas si son travail, mais c'est l'idée.

+0

En fait, je travaille avec le moteur de stockage MyISAM qui ne supporte pas les clés étrangères. Aucune suggestion? Je pourrais convertir toutes mes tables en InnoDB mais cela va être beaucoup de travail fastidieux que j'espère éviter. –

+0

@JoeyDuke: que voulez-vous dire ne supporte pas la clé étrangère ?? Votre colonne 'user_id' dans la table' articles' est une clé étrangère. Toute base de données prend en charge les clés étrangères. – Mischa

0

Tout d'abord, merci pour l'aide. J'ai trouvé une solution qui fonctionne bien pour moi que je vais poster et essayer d'expliquer. Je suis un Noob chez CI ainsi que PHP pour la plupart, si nue avec moi.

Mon contrôleur est comme ceci:

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; 
} 

Comme vous pouvez le voir, la fonction getComments dans mon modèle était la clé.C'est l'instruction JOIN qui gère ce que j'essayais d'accomplir. Je sais qu'il y a probablement des façons plus propres et plus efficaces de le faire, en combinant les deux fonctions, mais en tant que débutant, je voulais que ce soit plus facile à comprendre.

Espérons que cela peut aider les autres.

Questions connexes