Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

CodeIgniter, models, and ORM, how to deal with this?

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, Doctrine, 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?

like image 411
jävi Avatar asked Jan 26 '10 16:01

jävi


People also ask

What ORM is used in CodeIgniter?

Gas ORM. A lightweight and easy-to-use ORM for CodeIgniter. Gas was built specifically for CodeIgniter app. It uses CodeIgniter Database packages, a powerful DBAL which support numerous DB drivers.

How check model loaded or not in CodeIgniter?

$config['log_path'] = 'another/directory/logs/'; CI will then create the log file in the directory. monitor the log files as you like. You can get the debug message to see if your model is already loaded or not in the log files.

What is the use of model in CodeIgniter?

In CodeIgniter Model are the PHP classes where all database related manipulation is done e.g. fetching records, insert, update, and delete records. Within this, all data processing logic is done. All model files are managed in application/models directory and they are load and access by the controller.


2 Answers

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!

like image 179
Tilo Mitra Avatar answered Oct 17 '22 03:10

Tilo Mitra


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

like image 29
Daniele Teti Avatar answered Oct 17 '22 03:10

Daniele Teti