views:

1405

answers:

5

Hello, I'm starting with CodeIgniter and after several hours diving in Google I'm a bit confused.

Let's try to explain my question with a easy example: I have a table 'car' with the fields 'name' and 'color'. Therefore I want to have a php class Car, so that my code could look finally like this:

$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!)

Therefore, I am looking for something pretty similar to what you have in RubyOnRails or Django (Python). I need to handle all kind of relationships, and to be able of write code in a true OOP+MVC way.


These are my failed approaches to get it:

Using an external ORM (DataMapper, PHPDoctrine, AcidCrud...)

They either requires too many settings, or they handle relationships in a poor way.

Using CodeIgniter classes (to extend the CodeIgniter's Model class)

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);
}

And so on... Problem with this approach is that if a do a var_dump() of a $car object, I see that it contains a lot of stuff from the CodeIgniter, such as the objects CI_Config, CI_Input, CI_Benchmark, etc. Therefore I think this is not a good solution, because each object of my class Car, it will contain a lot of repeated data, (it will have a poor performance!), isn't it?

Not using the CodeIgniter's models

I could make my models without extending them from CodeIgniter's Model class, and then using the regular PHP5 constructor (__construct() instead of function Car()), but problem in this case is: how I access to the $db object to make querys using the CodeIgniter's ActiveRecord? and, how I load the models (its classes) within the controllers?


Thank you in advance, and please excuse me if my english sucks or if the post is too long.

A: 

take a look the the codeigniter wiki page for ORM

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

Tom Schlick
I read that and I'm more confused. Excluding the external ORM (as I said I think they are not a good approach in my case), do you know which is difference between this:http://codeigniter.com/user_guide/database/active_record.htmland this:http://codeigniter.com/wiki/ActiveRecord_Class/?
jävi
A: 

You probably want something like this:

   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;
        }
    }

Hope that helps!

Tilo Mitra
Note that this class is outside of the Codeigniter Model - You should probably place it in /system/application/libraries and then load it using $this->load->library('cars');
Tilo Mitra
+2  A: 

Try with Doctrine, is a great ORM and can be easily integrated in CodeIgniter.

Daniele Teti
Finally I did that. This tutorial was pretty useful:http://www.phpandstuff.com/articles/codeigniter-with-doctrine-sample-code-screencast
jävi
Doctrine is really amazing and that tutorial is very usefull.Read those links too (could be usefull):http://www.doctrine-project.org/documentation/manual/1_2/nl/cachingandhttp://www.doctrine-project.org/documentation/manual/1_2/en/improving-performance
Daniele Teti
A: 

I had good luck with using Propel with codeigniter.

Lancewf
A: 

What you want to do is create a library that extends the ActiveRecord class. Some people are ahead of you:

http://codeigniter.com/wiki/ActiveRecord_Class/

good mods in the thread, here:

http://codeigniter.com/forums/viewthread/101987/

If you're looking for ORM methods that are general to your app, just extend the ActiveRecord class. For my application, knowing the structure of a table allows me to scaffold (auto-generate) forms, and do other mapping. I do API-to-API mapping, so I include a GetStructure() method in MyActiveRecord and build other things from there.

(RoR snickering can bugger off now)

Edit: while I am a fan of the scope and power of Doctrine, I think it's demand for command-line usage places it beyond the spirit of CI. What's right for you is what's right for you, but if I'm going to use Doctrine, I might as well use Symfony, right? Or RoR, for that matter, right?? See where I'm gong with this? Right tool for the right time.

NewAlexandria