-
Notifications
You must be signed in to change notification settings - Fork 0
Home
<?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';
}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);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(); <?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();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
SELECTstatement
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
$tablena zaklade podmienok uvedenych v$onsposobomRIGHT JOIN. - ak je zvolene
$name, tak sa tabulka sa joine pod lokalnym menom uvedenom v$name - pole
$onmoze 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,%sa podobne) - string
opetator(volitelne) - operator pouzity pred podmienkou (ak nie je prva),ANDdefaultne
- string
- pripoji tabulku
-
$criteria->leftJoin(string $table, array $on = array(), string $name = null)- pripoji tabulku
$tablena zaklade podmienok uvedenych v$onsposobomLEFT JOIN. - ak je zvolene
$name, tak sa tabulka sa joine pod lokalnym menom uvedenom v$name - pole
$onmoze 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,%sa podobne) - string
opetator(volitelne) - operator pouzity pred podmienkou (ak nie je prva),ANDdefaultne
- string
- pripoji tabulku
-
$criteria->mergeWith($criteria)- zluci aktualne kriteria s novymi z argumentu
-
$criteriamoze byt instanciadibiar\Criteriaalebo podle hodnot, z ktorych bude vyskladana instanciadibiar\Criteria
-
$criteria->where(string $rule, array $params = array(), string $opeator = 'AND')- prida novu podmienku do
WHERE -
$paramsreprezentuje parametre pre podmienku (ak$ruleobsahuje%i,%sa podobne) -
$operatorpredstavuje operator pouzity pred podmienkou (ak nie je prva)
- prida novu podmienku do
-
$criteria->having(string $rule, array $params = array(), string $opeator = 'AND')- prida novu podmienku do
HAVING -
$paramsreprezentuje parametre pre podmienku (ak$ruleobsahuje%i,%sa podobne) -
$operatorpredstavuje operator pouzity pred podmienkou (ak nie je prva)
- prida novu podmienku do
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
$columnsa musi rovnat hodnote$value
- Hodnota v stlpci
-
$criteria->search(string $column, string $value, $onHaving = false, string $opeator = 'AND')- V stlpci
$columnsa hodnota$valuebude vyhladat na zakladeLIKE
- V stlpci
-
$criteria->between(string $column, integer $start, integer $end, $onHaving = false, string $opeator = 'AND')- Hodnota v stlpci
$columnmusi byt z intervalu<$start; $end>
- Hodnota v stlpci
-
$criteria->in(string $column, string[] $values, $onHaving = false, string $opeator = 'AND')- Hodnota v stlpci
$columnmusi byt jedna z hodnot$values
- Hodnota v stlpci
-
$criteria->notIn(string $column, string[] $values, $onHaving = false, string $opeator = 'AND')- Hodnota v stlpci
$columnniesmie byt jedna z hodnot$values
- Hodnota v stlpci
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 akoDateTimeobjekt -
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`.
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 bytcallable - moze obsahovat parameter
allowEmpty, ktory dovoli/zakaze nevyplneny parameter, defaultnetrue
-
in- hodnota musi byt najdena v
haystack- co je vlastne povinny parameter - ak je
haystackpole, pouziva sain_array, inacmb_strpos - moze obsahovat parameter
allowEmpty, ktory dovoli/zakaze nevyplneny parameter, defaultnetrue
- hodnota musi byt najdena v
-
numeric- overi, ci je hodnota ciselneho typu
- moze obsahovat parameter
allowEmpty, ktory dovoli/zakaze nevyplneny parameter, defaultnetrue
-
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, defaultnetrue
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.