2011-01-05 5 views
0

J'entre dans CodeIgniter et essaye de comprendre la bonne architecture pour mes modèles. Quel genre de modèles voulez-vous créer pour l'exemple simple:Comment utiliser les modèles dans CodeIgniter?

  • page liste des entrées de blog: montre une partie des données d'entrée, le nombre de commentaires
  • page d'entrée
  • blog: affiche toutes les données d'entrée, liste des commentaires (avec une partie des données de commentaire)
  • page de commentaires: affiche toutes les données de commentaire

J'essaie d'obtenir ce droit pour que ce soit simple et efficace. Je ne veux pas charger trop d'informations (à partir de la base de données) sur les pages où je n'ai pas besoin d'eux.

E.g. Le même modèle d'entrée doit-il gérer à la fois les entrées multiples et une seule entrée? Et comment les commentaires devraient-ils être chargés? J'ai seulement besoin du nombre de commentaires sur la page d'entrées multiples (liste) mais certaines des données de commentaire sur la seule page d'entrée. Comment voulez-vous gérer cela?

+1

* (officiel) * [Créer un blog en 20 minutes] (http://codeigniter.com/tutorials/watch/blog/) – Gordon

Répondre

0

Oui, vous êtes model_model modèle devrait gérer toutes les questions connexes et la logique pour toute entrée/article, mais pour les commentaires liés je voudrais faire un modèle différent, appelons-le comments_model.

Ensuite, vous allez voir quelles données doivent être affichées et créer des méthodes pour récupérer/gérer ces données dans vos modèles.

Par exemple. Pour une page d'entrée de blog dont vous aurez besoin get_entry méthode article_model et get_article_comments dans le modèle de commentaires, puis pour la page de liste de blog, vous devez get_entryes et get_article_number_of_comments dans le modèle de commentaire ....


Modifier

Pour une page qui répertorie 20 entrées de blog, vous devrez faire une requête pour lister tous les entrées de blog en appelant article_model-> get_entryes, et pour déplier une entrée 1, vous pouvez appeler get_single_entry (ou get_entryes où vous limitez le résultat, ou get_entry_by_uri, ou get_entry_by_id ...). Ensuite, pour obtenir le nombre de commentaires pour chaque entrée, vous pouvez faire un get_multiple_nr_comment dans le modèle de commentaire où vous passez les identifiants d'entrée et vous aurez une requête comme "where comments.entry_id IN (1, 34, 55 ...)" Il existe un certain nombre de façons de comptabiliser plusieurs nombres de commentaires dans une requête.

Vous aurez donc 2 requêtes par page.

+0

Pour moi cela ne semble pas trop efficace .. Si vous suggérez que "..model devrait gérer toutes les requêtes et la logique connexes. . "cela commencerait à générer beaucoup d'appels db. Par exemple. une page qui répertorie 20 entrées de blog. Je devrais faire 21 appels de base de données. Un pour la liste des entrées et un pour chaque entrée pour obtenir le nombre de commentaires. Droite? – ATT

+0

@ATT: édité la réponse avec plus d'informations sur la façon dont vous pouvez faire vos pages faire 2 requêtes seulement. –

+0

vous pouvez utiliser une jointure SQL pour obtenir le nombre de commentaires pour chaque entrée sans utiliser une requête séparée pour obtenir le nombre de commentaires ... – kevtrout

0

Vous pouvez créer MY_Model, quelque chose comme ceci:

class MY_Model extends CI_Model { 

    var $table = '';//database table 

    function __construct(){ 
     parent::__construct(); 
    } 

public function get($id = NULL) { 
     $query = $this->db->get_where($this->table, array('id' => (int)$id), 1, 0); 
     if ($query->num_rows() === 1) { 
      return = $query->result(); 
     } 
     return NULL; 
} 

    function get_one($id=NUNLL){} 

    function update($id=NULL, $data=array()){} 

    function delete($id=NULL){} 

    etc... 

} 

Et puis dans vos modèles par table vous pouvez étendre MY_Model, quelque chose comme ceci:

class My_Table_model extends MY_Model { 

    function __construct(){ 
     parent::__construct(); 
     $this->table='my_table'; 
    } 
} 

Vous pouvez alors utiliser des méthodes de My_Model dans vos modèles. Dans votre contrôleur, vous pouvez avoir quelque chose comme ceci:

class Table_Controller extends Front_Controller { 

    function __construct(){ 
     parent::__construct(); 
     $this->load->model('my_table_model'); 
    } 

    function comments(){ 
     $this->my_table_model->get($get_id_somehow); 
    } 

} 

Si vous voulez remplacer quelque chose que vous pouvez faire comme ceci dans vos modèles qui s'étend My_Model:

function my_method($id=NULL, $data=array()){ 
    return parent::my_method($id, $data); 
} 
Questions connexes