Skip to content
Tomáš Tatarko edited this page Apr 5, 2014 · 3 revisions

Vytvorenie noveho

	<?php

	class Query extends DibiActiveRecord\ActiveRecord {

	}

V tomto momente mame funkcny active record, ktory sa bude odkazovat na tabulku Query v aktivnom pripojeni databazy pri dibi. Pokial chcem implicitne zvolit iny nazov tabulky pre tento model, jednoducho pretazim metodu tableName().

	<?php

	class Query extends DibiActiveRecord\ActiveRecord {

		public function tableName() {
			return 'queries';
		}
	}

Zaroven vsetky active record musia mat svoj primarny kluc, na zaklade ktoreho je mozne jednotlive riadky v tabulke identifikovat. Ten je defaultne nastaveny na field id, no je tu moznost zvolit iny setnut property $primaryKey. Bohuzial momentalne nie je mozne vyuzivat primarny kluc zlozeny z viacerych stlpcov (#todo).

	<?php

	class Invoice extends DibiActiveRecord\ActiveRecord {

		protected $primaryKey = 'invoice_id';
	}

Vytvaranie zaznamov

Kdekolvek v ramci systemu je mozne vytvorit novy zaznam a ulozit ho do db. Staci vytvorit instanciu active recordu a zavolat metodu save().

	<?php

	$model = new Query;
	$model->title = 'Some title';
	$model->save();

Samozrejme je mozne setnut aj vsetky attributy modelu naraz. A zaroven je mozne to urobit viacerymi sposobmi, ktore sa od seba odlisuju podla toho, ci su aplikovane filtre alebo nie. (pozri nizsie pre viac info o filtroch).

	<?php

	$attributes = array(
		'title' => 'Some title',
		'authorId' => $_SESSION['user_id'],
	);

	// zdedene z `ArrayObject` - neaplikuju sa filtre
	$model = new Query($attributes);
	$model->exchangeArray($attributes);

	// interne setovanie atributov - aplikuju sa filtre
	$model->setAttributes($attributes);

Vyhladavanie zaznamov

Na zaklade hodnoty primarneho kluca:

	<?php

	$model = Query::model()->findByPk($id);

Vyhladavenie na zaklade kriterii:

	<?php

	// ziska vsetky modely vyhovujuce setnutym criteriam (vsetky riadky tabulky by default)
	$models = Query::model()->findAll();

	// ziska prvy model v poradi ktory vyhovuje zvolenych kriteriam
	$model = Query::model()->find();

	// pre editacii kriterii volam metody nad instanciou `Criteria` objektu daneho modelu
	$model = Query::model();
	$criteria = $model->getCriteria();
	$criteria->search('title', 'some');
	$models = $model->findAll();

Praca s modelmi

	<?php

	// ulozi model az po uspesnom zvalidovani
	$model->save();

	// Pokusi sa ulozit zaznam bez validovania atributov
	$model->save(false); 

	// zisti, ci je zaznam novym alebo uz existujucim v DB
	$model->isNewRecord(); 

	// aktualizuje hodnoty attributov podla aktualneho stavu v DB
	$model->refresh();

	// zmaze zaznam z DB
	$model->delete();

	// pre atribut $column setne filter
	$model->setFilter($column, dibiar\Filter $filter); 

	// pre atribut $column prida validator
	$model->addValidator($column, dibiar\Validator $validator);

	// po zavolani validacie vrati zoznam chyb pre jednotlive fieldy od jednotlivych validatorov
	$model->getErrors();

Kriteria vyhladavania

Dostupne metody:

  • $criteria->limit(integer $limit)
    • obmedzi pocet vysledkov
  • $criteria->offset(integer $offset)
    • nastavi offset pre skipnutie pozadovaneho poctu vysledkov
  • $criteria->select(string ...$fields)
    • ktore fieldy vyberat
    • ide vlastne o SELECT statement

Nasledujuce metody je mozne aj viackrat, kedze sa ukladaju do stacku - predchadazuje volanie nie je nahradene

  • $criteria->orderBy(string $sorter)
    • podla ktoreho stlpca zoradit vysledky
  • $criteria->groupBy(string $field)
    • podla ktoreho stlpca groupovat vysledky
  • $criteria->rightJoin(string $table, array $on = array(), string $name = null)
    • pripoji tabulku $table na zaklade podmienok uvedenych v $on sposobom RIGHT JOIN.
    • ak je zvolene $name, tak sa tabulka sa joine pod lokalnym menom uvedenom v $name
    • pole $on moze by vyskladane zo stringov urcujucich jednotlive podmienky alebo poli obsahujuce nasledujuce prvky:
      • string rule (povinne) - samotny predpis podmienky
      • array params (volitelne) - parametre pre podmienku (ak obsahuje %i, %s a podobne)
      • string opetator (volitelne) - operator pouzity pred podmienkou (ak nie je prva), AND defaultne
  • $criteria->leftJoin(string $table, array $on = array(), string $name = null)
    • pripoji tabulku $table na zaklade podmienok uvedenych v $on sposobom LEFT JOIN.
    • ak je zvolene $name, tak sa tabulka sa joine pod lokalnym menom uvedenom v $name
    • pole $on moze by vyskladane zo stringov urcujucich jednotlive podmienky alebo poli obsahujuce nasledujuce prvky:
      • string rule (povinne) - samotny predpis podmienky
      • array params (volitelne) - parametre pre podmienku (ak obsahuje %i, %s a podobne)
      • string opetator (volitelne) - operator pouzity pred podmienkou (ak nie je prva), AND defaultne
  • $criteria->mergeWith($criteria)
    • zluci aktualne kriteria s novymi z argumentu
    • $criteria moze byt instancia dibiar\Criteria alebo podle hodnot, z ktorych bude vyskladana instancia dibiar\Criteria
  • $criteria->where(string $rule, array $params = array(), string $opeator = 'AND')
    • prida novu podmienku do WHERE
    • $params reprezentuje parametre pre podmienku (ak $rule obsahuje %i, %s a podobne)
    • $operator predstavuje operator pouzity pred podmienkou (ak nie je prva)
  • $criteria->having(string $rule, array $params = array(), string $opeator = 'AND')
    • prida novu podmienku do HAVING
    • $params reprezentuje parametre pre podmienku (ak $rule obsahuje %i, %s a podobne)
    • $operator predstavuje operator pouzity pred podmienkou (ak nie je prva)

Nasledujuce metody vytvoria specificke pripady podmienok. Argument $onHaving rozhoduje o tom, ci podmienka bude pouzita v HAVING v pripade true alebo WHERE v pripade false. Argument $operator predstavuje operator pouzity pred podmienkou (ak nie je prva). Samozrejme, vsetky metody mozu byt volane aj viackrat a vzajomne sa neprepisuju.

  • $criteria->compare(string $column, string $value, $onHaving = false, string $opeator = 'AND')
    • Hodnota v stlpci $column sa musi rovnat hodnote $value
  • $criteria->search(string $column, string $value, $onHaving = false, string $opeator = 'AND')
    • V stlpci $column sa hodnota $value bude vyhladat na zaklade LIKE
  • $criteria->between(string $column, integer $start, integer $end, $onHaving = false, string $opeator = 'AND')
    • Hodnota v stlpci $column musi byt z intervalu <$start; $end>
  • $criteria->in(string $column, string[] $values, $onHaving = false, string $opeator = 'AND')
    • Hodnota v stlpci $column musi byt jedna z hodnot $values
  • $criteria->notIn(string $column, string[] $values, $onHaving = false, string $opeator = 'AND')
    • Hodnota v stlpci $column niesmie byt jedna z hodnot $values

Filtre

Filtre pri FRM active recorde su vlastne getters/setters pre atributy modelu. Zadefinovat ich mozem jednoducho pretazenim metody filters().

	<?php

	class Query extends DibiActiveRecord\ActiveRecord {

		public function filters() {
			return array(
				'params' => 'json', // field params sa bude chapat ako json a teda bude on-the-fly encodovany/decodovany
				'createTime' => 'datetime', // mysql timestamp field - bude vystupovat ako DateTime objekt
			);
		}
	}

Zavolanie filtru nad niektorym z modelov docielim tak, ze bude hodnotu atributu ziskavat ako property objektu. Pokial budem atribut ziskavat prvok pola, ziskam raw data.

	<?php

	$model = Query::model()->find();

	var_dump(
		$model->params, // array('index' => 'value');
		$model['params'] // '{"index":"value"}'
	);

Zoznam dostupnych filtrov:

  • boolean - hodnota je forcovana do booleanu a v db sa ukladaju len 0/1 hodnoty
  • datetime - field sa chape ako cas/datum a preto funguje ako DateTime objekt
  • float - hodnota sa forcuje sa floatu
  • integer - hodnota sa forcuje sa integeru
  • json - hodnota sa encoduje/decoduje ako json

Filtre je mozne vytvorit aj nove a to vytvorenim novej triedy v namespaci DibiActiveRecord\Filter' v priecinku /source/Filter, pricom tato trieda musi implementovat interface DibiActiveRecord\Filter`.

Validatory

Pre validaciu atributov modelu este pred volanim insertu/updatu priamo v databaze je mozne zadefinovat zoznam pravidiel/validatorov pre jednotlive atributy daneho modelu. Deje sa tak jednoducho pretazenym metody validators().

	<?php

	class Query extends DibiActiveRecord\ActiveRecord {

		public function validators() {
			return array(
				array('authorId, title, query', 'required'),
				array('id, authorId, downloads', 'numeric'),
				array('title', 'string', 'maxLength' => 255),
				array('authorId', 'in', 'haystack' => array(5466, 17482)),
				array('query', array($this, 'modelSpecificValidator')),
			);
		}

		public function modelSpecificValidator($validator) {
			if(strtolower(substr($validator->getValue(), 0, 6)) !== 'select') {
				$validator->addError('Non-select queries are not supported');
			}
		}
	}

Zoznam dostupnych validatorov:

  • callback
    • skontoluje hodnotu na zaklade predaneho callbacku
    • musi obsahovat parameter callback, ktora musi byt callable
    • moze obsahovat parameter allowEmpty, ktory dovoli/zakaze nevyplneny parameter, defaultne true
  • in
    • hodnota musi byt najdena v haystack - co je vlastne povinny parameter
    • ak je haystack pole, pouziva sa in_array, inac mb_strpos
    • moze obsahovat parameter allowEmpty, ktory dovoli/zakaze nevyplneny parameter, defaultne true
  • numeric
    • overi, ci je hodnota ciselneho typu
    • moze obsahovat parameter allowEmpty, ktory dovoli/zakaze nevyplneny parameter, defaultne true
  • required
    • zisti, ci je hodnota fieldu vyplnena
  • string
    • obmedzi hodnoty iba na stringy
    • moze obsahovat parameter minLength - minimalne dlzka stringu
    • moze obsahovat parameter maxLength - maximalna dlzka stringu
    • moze obsahovat parameter allowEmpty, ktory dovoli/zakaze nevyplneny parameter, defaultne true

Validatory je mozne vytvorit aj nove a to vytvorenim novej triedy v namespaci DibiActiveRecord\Validator v priecinku /source/Validator, pricom tato trieda musi implementovat interface DibiActiveRecord\Validator a moze extendovat abstraktnu triedu DibiActiveRecord\Validator\AValidator.