Narzędzia użytkownika

Narzędzia witryny


model

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();
}
model.txt · ostatnio zmienione: 2024/09/15 16:22 przez 127.0.0.1