====== Model ======
----
===== Usuwanie wielu rekordów =====
Users::deleteAll(['user_id' => $mod->id_user]);
===== Filtrowanie po liście oddzielonej przecinkami =====
Model search
use yii\db\Expression;
//etapy - pole typu string "1,2,5,7"
$exp = new Expression("FIND_IN_SET($this->etapy,etapy)");
if ($this->etapy != null) {
$query->andFilterWhere(['>',$exp,0]);
}
===== dataProvider=====
Przykład
use yii\data\ActiveDataProvider;
$dataProvider = new ActiveDataProvider([
'query' => Pendaftar::find()
->select(['pendaftar.*','user.*'])
->from('pendaftar')
->leftJoin('user', 'user.id=pendaftar.id_user_pendaftar')
]);
return $this->render('index', [
'dataProvider' => $dataProvider,
]);
Dodawanie dodatkowej klauzuli where do dataProvider w kontrolerze
$dataProvider->query->andWhere('status = 10');
Domyślne sortowanie
$dataProvider->sort->defaultOrder = ['nr' => SORT_DESC];
===== Relacje w modelu =====
Jak korzystać z relacji w modelu\\
**Tabele , modele tabel i pola**\\
**user - model User**
* id
* login
* haslo
* id_profil
**user_profil - model UserProfil**
* id
* imie
* nazwisko
Poprzez pole id_profil tabele powiązane są relacyjnie\\
W modelu User obsługującym tabelę user znajduje się funkcja:\\
public function getProfil() {
return $this->hasOne(UserProfil::className(), ['id' => 'id_profil']);
}
**Przykład użycia**\\
$mod_user = User::find()->where(['=', 'id', $id])->one();
echo 'Imie: ' . $mod_user->profil->imie;
===== Validacja przeciw atakom XSS =====
Metoda polega na filtrowaniu (validacji) atrybutów modelu
przed ich zapisaniem.\\
W modelu należy dodać funkcję:
public function beforeValidate() {
foreach (array_keys($this->getAttributes()) as $attr) {
if (!empty($this->$attr)) {
$this->$attr = \yii\helpers\HtmlPurifier::process($this->$attr);
}
}
return parent::beforeValidate();
}
HtmlPurifier to klasa, która usuwa z danych podejrzane fragmenty
===== Dynamiczny model =====
Model dla, którego nie ma tabeli w bazie danych.
Wykorzystywany do przekazywania danych za pomocą formularza
public function actionForm(){
$model = new \yii\base\DynamicModel([
'name', 'email', 'address'
]);
$model->addRule(['name','email'], 'required')
->addRule(['email'], 'email')
->addRule('address', 'string',['max'=>32]);
if($model->load(Yii::$app->request->post())){
// tu można coś robić z danymi formularza model
return $this->redirect(['view']);
}
return $this->render('form', ['model'=>$model]);
}
===== Duplikowanie rekordu =====
Jak zduplikować rekord zmieniając wartości wybranych atrybutów
W akcji kontrolera:
1. Tworzymy model istniejącego rekordu
$model = $this->findModel($id);
2. Modyfikujemy wybrane atrybuty
$model->id = null; // !!! Ważne jeśli id jest PRIMARY i autoincrement
$model->data_zakonczenia = null;
$model->rozpoczecie = date('Y-m-d');
$model->zakonczony = 0;
$model->widoczny = 0;
3. Ustawiamy parametr informujący, że należy stworzyć nowy rekord
$model->isNewRecord = true;
4.Zapisujemy model do rekordu
$model->save();
====== Hurtowy INSERT ======
INSERT do tabeli: user_grupa_rabat danych z tabeli $insert_arr
foreach ($mod_rabat as $row) {
$insert_arr[] = [
'id_user' => $row->id_user,
'id_grupa_towarowa' => $row->id_grupa_towarowa,
'rabat' => $row->rabat
];
}
if (count($insert_arr) > 0) {
$columnNameArray = ['id_user', 'id_grupa_towarowa', 'rabat'];
$insertCount = Yii::$app->db->createCommand()
->batchInsert(
'user_grupa_rabat', $columnNameArray, $insert_arr
)
->execute();
}