37 votes

CodeIgniter, modèles et ORM, comment faire face à cela?

Je commence avec CodeIgniter et après plusieurs heures de plongée dans Google, je suis un peu confus.

Nous allons essayer d'expliquer ma question avec un exemple simple: j'ai une table 'voiture' avec les champs " nom " et "couleur". Donc je veux avoir une classe php Voiture, de sorte que mon code pourrait ressembler enfin comme ceci:

$car = new Car('BMW', 'red'); //new $car Object
$car->save(); //this will make an SQL insert to the table 'car'

//Lets query all cars
$cars = Car::get_all(); 
//cars will be an array of Car objects, (not a set of rows!)

Donc, je suis à la recherche de quelque chose d'assez similaire à ce que vous avez dans au système rubyonrails ou Django (Python). J'ai besoin de manipuler tout type de relations, et d'être capable d'écrire du code dans un vrai OOP+MVC façon.

Ce sont mes échoué approches pour l'obtenir:

À l'aide d'un ORM (DataMapper, de la Doctrine, AcidCrud...)

Ils ont besoin de trop de paramètres, ou ils gérer les relations dans une mauvaise façon.

À l'aide de CodeIgniter classes (pour prolonger la CodeIgniter du Modèle de la classe)

class Car extends Model{
public function Car($name='',$color='')
{
    $this->name     =   $name;
    $this->color    =   $color;      
    parent::Model();
}
public function save()
{
    $data = array(
                   'name'   =>  $this->name ,
                   'color'  =>  $this->color 
                  );

    $this->db->insert('cars' $data);
}

Et ainsi de suite... Problème avec cette approche est que si un faire un var_dump() de dollars de l'objet voiture, je vois qu'il contient beaucoup de choses à partir de la CodeIgniter, tels que les objets CI_Config, CI_Input, CI_Benchmark, etc. Donc je pense que ce n'est pas une bonne solution, parce que chaque objet de ma classe de Voiture, il contient beaucoup de données répétée, (il aura un mauvais rendement!), n'est-ce pas?

Ne pas utiliser le CodeIgniter modèles

J'ai pu faire mes modèles sans les étendant à partir de CodeIgniter du Modèle de la classe, puis à l'aide de l'ordinaire PHP5 constructeur (__construct() au lieu de la fonction Car()), mais le problème dans ce cas est: comment j'ai accès à l' $db objet de créer des requêtes sur l'aide de la CodeIgniter est ActiveRecord? et, comment je charge les modèles (ses cours) au sein de l'contrôleurs?

14voto

Tilo Mitra Points 1626

Vous voulez probablement quelque chose comme ça:

    class Cars {

    //List all neccessary vars here

    function __construct() {
        //get instance of Codeigniter Object and load database library
        $this->obj =& get_instance();
        $this->obj->load->database();
    }

//You can now list methods like so:
function selectCar($name, $color) {

        $this->obj->db->select('color')->from('car')->where('color', $color);
        $query = $this->obj->db->get();

        switch ($query->num_rows()) {
        case 0:
            return false;
            break;
        default:
            return $query->result();
            break;
        }
    }
 

J'espère que ça t'as aidé!

9voto

Daniele Teti Points 1356

Essayez avec Doctrine , est un excellent ORM et peut être facilement intégré à CodeIgniter.

4voto

Tom Schlick Points 1897

jetez un oeil à la page wiki de codeigniter pour ORM

http://codeigniter.com/wiki/ORM/

3voto

Joel Verhagen Points 1984

Pour les futurs utilisateurs de Google, voici un tutoriel sur l’intégration de CodeIgniter 2 à Doctrine 2.

Faites-moi savoir si vous avez des problèmes.

2voto

Lancewf Points 21

J'ai eu de la chance avec l'utilisation de Propel avec codeigniter.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X