====== 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(); }