2011-10-19 5 views
1

J'ai donc ce morceau de code dans un modèle étendu (MY_Model) dans CodeIgniter:En utilisant une seule fonction get pour tous les modèles

function get($options = array(), $selects = array(), $joins = array(), $table, $object = TRUE) 
{ 

    if(!empty($options)) 
    { 
     foreach($options as $option => $array) 
     { 
      foreach($array as $column => $value) 
      { 
       $this->db->{$option}($column, $value); 
      } 
     } 
    } 

    if(!empty($select)) 
    { 
     foreach($selects as $select) 
     { 
      $this->db->select($select); 
     } 
    } 

    if(!empty($joins)) 
    { 
     foreach($joins as $join => $array) 
     { 
      foreach($array as $jointable => $column) 
      { 
       $this->db->join($join, $join.'.'.$column.'='.$jointable.'.'.$column); 
      } 
     } 
    } 


    $query = $this->db->get($table); 

    return $query->result(); 

} 

où je peux passer des tableaux comme ci-dessous:

$options = array(
     'where' => array(
      'companys.companyID' => $companyID 
     ) 
    ); 

    $select = array(
     'companyID', 
     'companyName' 
    ); 

    $join = array(
     'persons' => array(
      'companys' => 'companyID' 
     ) 
    ); 

    $result = $this->companyModel->get($options, $select, $join, 'companys'); 

    print_r('<pre>'); 
    print_r($result); 

Ma question est, y at-il une raison pour laquelle ce n'est pas une bonne idée. J'ai étendu le CI_Model par défaut dans mon propre MY_Model, et tous les autres modèles peuvent utiliser get, et ont toujours leurs propres fonctions. J'ai des fonctions similaires pour les autres actions de base du CRUD.

Est-ce l'autre façon de séparer les fonctions dans les modèles pour faire la plupart du travail et avoir le plus petit contrôleur possible le meilleur itinéraire. Même si cela signifie que vous écrivez les mêmes mandrins de code dans tous les modèles? J'espère que ce n'est pas une question stupide ou j'ai mal compris quelque chose de fondamental sur MVC mais merci pour les réponses de toute façon.

Répondre

0

Bienvenue dans la longue rangée de développeurs qui essaient d'abstraire sql. L'abstraction de base de données est un concept de base dans les applications Web, mais ne fait en aucun cas partie du modèle MVC car un modèle est simplement décrit comme une collection de données et de méthodes qui devraient refléter votre domaine. En réalité, cela signifie souvent qu'il existe des méthodes commerciales et des rappels pour faire exactement cela. Comment vous persistez vos données est à vous. Exemples de modèles vous donnant une idée de ce qui devrait être fait sont here. Jetez également un coup d'oeil à Doctrine qui arrive à utiliser ActiveRecord dans la version 1.x et a récemment changé cela dans la version 2.0 pour un beaucoup plus simple Entity-Pattern avec des usines.

Votre méthode telle qu'elle est, me semble bien. Mais il y a un avertissement: Ne le pliez pas trop. Si vous écrivez une application et non un framework, vous êtes libre d'adopter votre domaine non seulement dans les affaires mais aussi dans un aspect technique. Si vous vous trouvez manipulant des requêtes qui ne sont pas possibles avec cette méthode, ne changez pas la méthode mais utilisez simplement une vraie requête.

Questions connexes