2012-10-17 12 views
5

Ho questo problema in codeigniter: Cerco di creare un sistema di albero di navigazione dal database.codeigniter group_by restituisce solo la prima riga

modello:

function getServices() 
{ 
$this->db->select('service_url, service_title, category_title');  
$this->db->join('services_category', 'services_category.id=services.category_id');  
$this->db->group_by('category_title'); 
$this->db->order_by('service_title', 'ASC');  
$query = $this->db->get('services'); 

if($query->result() == TRUE)  
{  
    foreach($query->result_array() as $row) 
    { 
     $result[] = $row; 
    } 
    return $result; 
    } 
} 

vista:

<?php if(isset($services) && $services) : foreach($services as $s) : ?>  
    <ul> 
    <li><a href="#"><?php echo $s['category_title'] ?></a>  
     <ul> 
     <li><?php echo anchor('services/' . $s['service_url'], $s['service_title']); ?></li> 
     </ul>  
    </li>  
    </ul>  
<?php endforeach; ?>  
<?php endif; ?> 

ormai fin qui tutto bene, il risultato sta tornando ogni categoria il modo si suppone, ma il servizio sta tornando un solo servizio per categoria e in alcune categorie ci sono 15 servizi. Qualcuno ha voglia di darmi una mano o una spiegazione che cosa sta andando male? Grazie mille.

"Non sono un esperto di php o codeigniter, ho appena iniziato non molto tempo fa, quindi per favore non sparare al principiante."

nota: ho provato senza il group_by e order_by, e sta tornando tutti i servizi, ma le categorie stanno ripetendo,

es:

category-a 
    service1 
category-a 
    service2 
category-b 
    service10 
category-b 
    service11 
category-c 
    service30 
category-c 
    service31 
.... 

risposta

4

Questa è una buona lettura per funzioni di aggregazione quando si utilizza Group By (MySQL) . Una spiegazione semplice sarebbe stato così

Date  | Amount 
2012-01-01 | 5 
2012-01-01 | 6 
2012-01-02 | 1 
2012-01-02 | 6 

Ora utilizzando SUM funzione di aggregazione come questo.

SELECT Date, SUM(Amount) as Total FROM table GROUP BY Date ORDER BY DATE; 

Il risultato sarà:

Date  | Amount 
2012-01-01 | 11 
2012-01-02 | 7 

Nel vostro scenario, GROUP BY non funzionerà come previsto, sarà solo ottenere uno Categoria dal momento che la query raggruppati per ogni categoria.

La soluzione ideale per questo è avere 2 funzioni separate, GetCategories e GetServices.

function getServices($category_id = false) 
{ 
    $this->db->select('service_url, service_title, category_title'); 
    $this->db->join('services_category', 'services_category.id=services.category_id'); 
    if ($category_id !== false) 
    $this->db->where('services.category_id', $category_id); 
    $this->db->order_by('service_title', 'ASC'); 
    $query = $this->db->get('services'); 

    if($query->result() == TRUE) 
    { 
    foreach($query->result_array() as $row) 
    { 
     $result[] = $row; 
    } 
    return $result; 
    } 
} 

function getCategories() 
{ 
    $this->db->select('category_id, category_title'); 
    $this->db->order_by('category_title', 'ASC'); 
    $query = $this->db->get('services_category'); 

    if($query->result() == TRUE) 
    { 
    foreach($query->result_array() as $row) 
    { 
     $result[] = $row; 
    } 
    return $result; 
    } 
} 

Poi nel file vista, è solo bisogno di fare un ciclo for sulle categorie poi fare un'altra query per ogni categoria. Ecco uno schema di quello che sarà simile,

<?php if(isset($categories) && $categories) : foreach($categories as $category) : ?> 
    <ul> 
    <li><a href="#"><?php echo $category['category_title'] ?></a> 
     <ul> 
     // how you get $services is similar to how you get $categories 
     <?php $services = $this->modelname->getServices($category['category_id']); 
     <?php foreach($services as $s) : ?> 
      <li><?php echo anchor('categories/' . $s['service_url'], $s['service_title']); ?></li> 
     <?php endforeach; ?> 
     </ul> 
    </li> 
    </ul> 
<?php endforeach; ?> 
<?php endif; ?> 
+0

uomo, sei una leggenda, lo giuro su Dio, io cercavo questo oltre quattro ore e nessuna risposta, sicuramente io scriverò un tutorial su questo sul blog, e naturalmente ti citerò. Grazie mille, apprezzo molto il tuo aiuto – lesandru

+0

in realtà voglio chiederti una cosa se non è troppo, è buona norma usare il modello nella vista? non rompe il MVC? – lesandru

+1

Ciao Alex, non infrange MVC poiché hai mantenuto la definizione dei dati nel modello, hai solo esposto i metodi del modello nella tua vista, che idealmente dovrebbe essere a livello di controller. Di solito uso gli helper in modo che tutte le chiamate al modello da entrambi i controller/viste siano in help. – ace

Problemi correlati