Codeigniter

logo van Wijhe Consultancy

14-12-2017
Eigen artikelen

afbeelding Codeigniter

MY_Model, een Nederlandse uitleg


Uitganspunten.


MY_Model class

 

De MY_Model class is een uitbreiding op de CI_Model class welke Codeigniter gebruikt.

Deze class geeft een volledige CRUD basis die het ontwikkelen van database interacties sneller en gemakkelijker maken.

(C = create; R = read, U = update, D = delete)

 

Met dank aan

 

Meestal eindig je met dit gedeelte

Niet vandaag.

De reden is simpel.
Zonder een inleiding en de vaststelling van een aantal basis aannames kan dit artikel snel verzanden in een
waterval van letters zonder betekenis.

 

Allereerst met dank aan Jamie Rumbelow

http://jamierumbelow.net/

 

Hij heeft deze uitbreiding op de CI_Model class geschreven.

Tevens heeft hij een drietal boeken over dit onderwerp geschreven.
Met name het eerste boek "the codeigniter handbook volume one" "who needs ruby?" gaat over deze uitbreiding.

https://efendibooks.com/books/codeigniter-handbook/vol-1

 

Jamie hanteert 3 concepten vanuit de Ruby wereld.

  • vet model, magere controller
  • conventie boven configuratie
  • herhaal jezelf niet

 

Vet model, magere controller

 

Jamie stelt dat :
Elke code welke je niet kunt verantwoorden om ergens anders te plaatsen, dien je in het model te plaatsen.

Het model dient de applicatie te sturen, niet de controller.

De controller dient om alles samen te brengen en de view dient om de gevevens te presenteren.

 

Conventie boven configuratie

 

Het hanteren van een vaststaande set van regels door het gehele project is beter dan het voordurend aanpassen van het systeem.

Om hier alle regels te schrijven gaat wat ver.
Koop daarvoor het boek zou ik zeggen.

Een aantal zijn wel handig om te weten.

 

  • Elke database model stuurt slechts 1 tabel aan
  • De naam van het model is in enkelvoud, de naam van de tabel is in het meervoud
    In het Nederlands zul je hier uizonderingen op dienen te maken (Hierover later meer)
  • Elke tabel heeft een id veld
  • Elke tabel heeft een gemaakt_op en een aangepast_op veld.

 

Herhaal jezelf niet

 

Het DRY Don't Repeat Yourself principe kan door bovenstaande toe te passsen bereikt worden.

 

Tot zover Jamie Rumbelow.

 

Ten tweede met dank aan Jeff Madsen

 

In het volgende artikel http://www.codebyjeff.com/blog/2012/01/using-jamie-rumbelows-my_model kreeg ik helder hoe de uitbreiding van Jamie te gebruiken.

Daarvoor Jeff, mijn dank

 

En nu: installatie en gebruik

 

Download

 

Download het bestand MY_Model.php en plaats deze in de ./application/core folder.

Codeigniter zal deze class automatisch laden en initialiseren.

 

Klant_model.php

 

Maak een model genaamd Klant_model.php

Plaats deze in de ./application/models folder

 

class Klant_model extends MY_Model
{

}

 

 

Klant controller

 

Maak een klant controller genaamd klant.php welke alle queries kan draaien

Plaats deze in de ./application/controllers folder

 

Hieronder volgt een lijst met een aantal van de beschikbare functies

Elk met een korte uitleg wat de functie doet en de werkelijke sql welke gegenereerd wordt.

 

( Vergeet niet de controller te beginnen met: )

 

$this->load->model('Klant_model');	

 

 

  Voorbeeld klant controller
//	Klant
class Klant extends CI_Controller 
{
  
	/*
	 * __construct
	 * 
	 */
    function __construct() 
    {		
        parent::__construct();

		$this->load->model('Klant_model');	
    }
	//-----/__construct
	
	
	//	index
	function index()
	{
		// 
		
		//-----/
	}
	//-----/index

//-----/

 

 

Naam conventies

 

De class zal proberen de naam van de tabel te raden, door het meervoud van de class naam te gebruiken.

Bijvoorbeeld

 

  naam tabel  

class Bericht_model extends MY_Model { }

 

...zal proberen de tabel berichten te benaderen.
In het Nederlands, maar niet in het Engels.
Daar heb je veelal de s als meervoudsvorm.
Berichten vind ik toch echt een betere naam dan berichts.

 

Als je dit mechanisme wilt uitschakelen, en in het Nederlands zal dit zeker voorkomen, kun je de tabel naam in de class zelf aangeven door de $_table instance variabele

 

  $_table  
class Klant_model extends MY_Model
{
    protected $_table = 'klanten';
}

 

Enkele CRUD functies gaan er vanuit dat de primaire key 'id' is genoemd.

Dit kun je over rulen door $primary_key instance variabele aan te geven

 

  $primary_key  
class Klant_model extends MY_Model
{
    protected $primary_key = 'klant_id';
}

 

Bij alle functies zal er een array als $result komen.

Deze kun je uitlezen door een print_r regel aan toe te voegen

 

  Voorbeeld uitlezen array  
$result = $this->Klant_model->get_all();

print_r($result) ;

 

 

De functies

 

get_all()

 

get_all() geeft alle records uit de tabel.

 

  get_all()  
$result = $this->Klant_model->get_all();
  geeft als SQL  
 
SELECT * FROM (`klanten`); 

 

 

order_by(waarde)->get_all()

 

order_by(waarde)->get_all() geeft alle records geordend door het veld naam.

 

  order_by() gecombineerd met get_all()  
$result = $this->Klant_model->order_by('naam')->get_all();
  geeft als SQL  
SELECT * FROM (`klanten`) ORDER BY `naam` ASC ;

 

 

get(waarde)

 

get(waarde) geeft het record waarbij de primaire sleutel (id) 2 is.

 

  get(waarde)  
$rij = $this->Klant_model->get(2);
  geeft als SQL  
SELECT * FROM (`klanten`) WHERE `id` = 2 ;

 

 

get_by(veld, waarde)

 

get_by(veld, waarde) geeft alle records waarbij het veld naam de waarde Jansen bevat

Als er meer dan 1 record is, wordt de eerste gegeven.

 

  get_by(veld, waarde)  
$rij = $this->Klant_model->get_by('naam', 'Jansen') ;
  geeft als SQL  
 
SELECT * FROM (`klanten`) WHERE `naam` = 'Jansen' ;

 

 

get_many(array(1,3,4))

 

get_many(array(1,3,4)) geeft alle records waarbij het veld id de waardes 1 of 3 4 bevat

 

  get_many(array(waarde1, waarde2, waarde3)  
$result = $this->Klant_model->get_many(array(1,3,4)) ;
  geeft als SQL  
 
SELECT * FROM (`klanten`) WHERE `id` IN (1, 3, 4) ; 

 

 

get_many_by(veld, waarde)

 

get_many_by(veld, waarde) geeft alle records waarbij het veld naam de waarde Jansen bevat

 

  get_many_by(veld, waarde)  
$result = $this->Klant_model->get_many_by('naam', 'Jansen') ;
  geeft als SQL  
SELECT * FROM (`klanten`) WHERE `naam` = 'Jansen' ;

 

 

order_by() => get_many_by()

 

order_by() => get_many_by() geeft alle records waarbij het veld status de waarde actief en het veld naam de waarde Jansen bevat, waarbij er een oplopende sortering op het veld naam plaatsvindt.

 

  order_by() gecombineerd met get_many_by()  
$result = $this->Klant_model->order_by('naam')->get_many_by(array('status'    => 'actief', 
															 'naam' 	 => 'Jansen') ) ;
  geeft als SQL  
SELECT * FROM (`klanten`) WHERE `status` =  'actief' AND `naam` =  'Jansen' ORDER BY `naam` ASC ;

 

 

count_by(veld, waarde)

 

count_by(veld, waarde) telt alle records waar het veld naam de waarde Jansen bevat.

 

  count_by(veld, waarde)  
$count = $this->Klant_model->count_by('naam', 'Jansen') ;
  geeft als SQL  
 
SELECT COUNT(*) AS `numrows` FROM (`klanten`) WHERE `naam` = 'Jansen' ;

 

 

count_all()

 

count_all() telt alle records in de tabel.

 

  count_all()  
$count = $this->Klant_model->count_all() ;
  geeft als SQL  
 
SELECT COUNT(*) AS `numrows` FROM (`klanten`) ;

 

 

insert(array(waarden))

 

insert(array(waarden)) voegt een record toe.

 

  insert(array(waarden))  
$insert_id = $this->Klant_model->insert(array('naam' => 'Pietersen', 'voorletters' => 'M.J.'), FALSE) ;
  geeft als SQL  
 
INSERT INTO `klanten` (`naam`, `voorletters`) VALUES ('Pietersen', 'M.J.') ;
  Met als nieuwe id ($insert_id)  
6

 

 

insert_many(array(waarden))

 

insert(array(waarden)) voegt meerdere records toe.

 

  insert_many(array(waarden))  
$insert_array = array(
					array('naam' => 'Klaassen', 'voorletters' => 'K.'),
					array('naam' => 'Grutters', 'voorletters' => 'G.'),
				);
$insert_ids = $this->article_model->insert_many($insert_array, FALSE) ; 
  geeft als SQL  
 
INSERT INTO `klanten` (`naam`, `voorletters`) VALUES ('Klaassen', 'K.'),
													 ('Grutters', 'G.') ;
  Met als nieuwe id's ($insert_ids)  
Array ( [0] => 7 [1] => 8 )


Dit waren alle SELECT en CREATE functies.


Als vervolg komt er nog een artikel met alle UPDATE en DELETE functies.

Tevens komt er nog een artikel en een werkende applicatie met alle genoemde functies.

Deze zal met Codeigniter versie 3 (develop) gemaakt worden.




Veel programmeer plezier ermee.


Tot ziens,


Ubel Jan van Wijhe


van Wijhe Consultancy

info@vanwijhecons.nl