2010-01-21 7 views
2

J'ai juste eu ce doute sur les modèles ...Codeigniter: Modélise des questions!

Ceci est mon premier projet 100% MVC (genre de) ... mon doute est ... quand malade faire une jointure, union ou quoi que ce soit avec plus de une table ... comment je fais ça? utiliser le même fichier modèle de la "table principale" ou j'ai besoin de créer un nouveau fichier modèle en utilisant les deux ou quels que soient les tableaux ??

Tkz ... Roberto!

Répondre

4

Vous pouvez le faire comme bon vous semble. Un modèle n'a pas avoir pour être limité à une seule table, vous pouvez JOIN, UNION et UPDATE n'importe quelle table que vous aimez de partout. Pour compléter les suggestions de Donny Kurnia, un très bon MY_Model existant a déjà été écrit par Jamie Rumbleow (avec quelques contributions de ofc), qui contient plusieurs méthodes get, count, insert, etc. Cela vous permet de simplifier la plupart des exigences CRUD de base en créant un modèle vide qui s'étend de MY_Model. C'est très bien pour une table get/insert/delete mais quand il s'agit de créer des méthodes nécessitant une jointure, la meilleure chose à faire est de les écrire vous-même. Lorsque vous joignez des tables, vous devez définir WHERE en fonction des noms de tables/alias et vous trouverez des noms de champs conflictuels si vous ne faites pas attention, ce qui signifie que créer une solution générale pour gérer toutes les requêtes de jointures de MY_Model va être TRÈS difficile ou juste un gâchis.

<?php if (!defined('BASEPATH')) exit('No direct script access allowed'); 

class Tickets_m extends MY_Model 
{ 
    // Basic get, insert, delete stuff handled in MY_Model 

    function get_client_tickets($category_slug = '') 
    { 
     $this->db->select('t.*') 
      ->select('c.title as category_title, c.slug as category_slug') 
      ->select('p.name as priority_name') 
      ->join('categories c', 'c.id = t.category_id') 
      ->join('priorities p', 'p.id = t.priority_id') 
      ->from('tickets t') 
      ->where('c.client_id', CLIENT_ID); 

     if($category_slug) 
     { 
      $this->db->where('c.slug', $category_slug); 
     } 

     return $this->db->get()->result(); 
    } 

    function get_client_ticket($id) 
    { 
     $this->db->select('t.*') 
      ->select('c.title as category_title, c.slug as category_slug') 
      ->select('p.name as priority_name') 
      ->join('categories c', 'c.id = t.category_id') 
      ->join('priorities p', 'p.id = t.priority_id') 
      ->from('tickets t') 
      ->where('c.client_id', CLIENT_ID) 
      ->where('t.id', $id); 

     return $this->db->get()->row(); 
    } 

    function insert($ticket) 
    { 
     $this->load->helper('date'); 

     $ticket['created_on'] = now(); 

     return parent::insert($ticket); 
    } 

} 

Voici un exemple d'un modèle très simple, je travaille avec au moment qui me montre combinant l'utilisation de MY_Model pour get, get_by, insérer, mettre à jour avec des méthodes personnalisées qui ont des jointures et des données supplémentaires en leur.

Vous pouvez également me voir surcharger insert() pour ajouter automatiquement à la date créée sans avoir besoin de le définir dans chaque contrôleur qui peut créer ou mettre à jour le ticket.

Si vous avez besoin encore plus magique folie de menuiserie auto-matic, essayez ORM avec quelque chose comme Doctrine ou DataMapper

+0

Uau ... des informations très nouvelles et très utiles sur ce MY_Model ... merci beaucoup – Roberto

3

Je voudrais partager mon approche pour cela.

D'abord, je fait ma propre classe MY_Model qui ont get_detail, get_total, get_list, méthode get_all, insert, update et delete. J'ai mis cette classe dans le dossier system/application/libraries dossier. Cette classe extends classe de CI. Toutes les requêtes connexes dans cette classe utilisant $this->tablename. Ensuite, la classe modèle réel aura besoin que ce code pour le faire fonctionner:

class Product_model extends MY_Model { 

    function Product_model() 
    { 
    parent::MY_Model(); 
    $this->tablename = 'product'; 
    } 

} 

Quand je dois rejoindre 2 tables ou plus, je mets le code dans le modèle de la table principale. Exemple: J'ai les tables product, category et user. Si j'ai besoin d'obtenir le produit, avec le nom de la catégorie et le nom d'utilisateur qui insèrent les données, alors la table 'principale' sera le produit. Je vais avoir cette méthode à l'intérieur Product_model:

function get_list_joined($start=0, $item_num=10, $condition='', $order_by='') 
{ 
    //do query for product, left join to category and user table 
    //return result 
} 

En utilisant cette approche, je vais encore avoir une fonction get_list qui renvoient uniquement des colonnes de la table product, et ont également la fonction get_list_joined que le retour colonne de la table product, table category et user table.

Il est important de déterminer d'abord la classe principale, afin d'éviter que plusieurs méthodes ne fassent la même chose.

Pour joindre, la classe de base de données incluse dans CI est suffisante. Mais je préfère utiliser AdoDB comme bibliothèque de base de données. Il offre plus de support de base de données que les CI. Mais pour commencer, et vous n'utilisez que mysql, alors la base de données de CI est suffisante. Apprenez-en un à la fois.