2017-07-01 1 views
0

J'ai trois tables: utilisateurs, catégories et users_cateogires.Codeigniter plusieurs à plusieurs requêtes

Je dois obtenir pour un utilisateur spécifique user toute la table d'utilisateur et le nom des catégories qu'il a. En mySql simple, je ferais quelque chose comme ceci:

select u.*, 
(select GROUP_CONCAT(name) from projects as p where p.user_id = u.id_user) as projects, 
(select GROUP_CONCAT(name) from categories as c where c.id_cat in 
(select cat_id from users_categories where user_id = u.id_user)) 
as categories from users as u 

Mais je ne peux pas trouver le moyen d'obtenir la classe active d'enregistrement de ce résultat useing CodeIgniter.

+0

Vous voulez que votre requête à l'aide de dossiers actifs. Est-ce? –

+0

Oui! C'est vrai. –

+0

Pourquoi n'as-tu pas choisi des jointures? –

Répondre

0
$this->db->select('GROUP_CONCAT(name)'); 
    $this->db->from('projects p'); 
    $this->db->where('p.user_id', 'u.id_user'); 
    $first_clause = $this->db->get_compiled_select(); 

    $this->db->select('cat_id'); 
    $this->db->from('users_categories'); 
    $this->db->where('user_id', 'u.id_user'); 
    $second_clause = $this->db->get_compiled_select(); 

    $this->db->select('GROUP_CONCAT(name)'); 
    $this->db->from('categories as c'); 
    $this->db->where("c.id_cat in ($second_clause) as u", NULL, FALSE); 
    $third_clause = $this->db->get_compiled_select(); 


    $this->db->select('u.*,$first_clause,$third_clause'); 
    $this->db->from('users as u'); 
    $query = $this->db->get(); 
    $result = $query->row_array(); 
    if ($query->num_rows() > 0) { 
     return $result; 
    } else { 
     return null; 
    } 

Les instructions compilées sont ce que vous cherchez. Maintenant, cela pourrait être une façon rapide et sale de le faire et il ya probablement une meilleure façon, mais cela devrait faire le travail si vous êtes sur une date limite.

La requête que j'ai envoyée n'est pas vraiment bien vérifiée, c'est juste pour vous pousser dans la bonne direction.

1

Vous pouvez également utiliser directement requête SQL dans le modèle

Vous aimez cette

$sql = "select u.*, (select GROUP_CONCAT(name) from projects as p where p.user_id = u.id_user) as projects, (select GROUP_CONCAT(name) from categories as c where c.id_cat in (select cat_id from users_categories where user_id = u.id_user)) as categories from users as u"; 
$query = $this->db->query($sql); 
$result = $query->result_array();