Implementarea relatiei Multe la Multe pentru cadrul Yii 2.

  • Instalare
  • Caracteristici
  • Crearea unui atribut editabil
  • Atasarea si configurarea comportamentului
  • Completarea relatiilor
  • Salvarea relatiilor fara atribuire masiva
  • Se adauga atributul ca sigur
  • Adaugarea controlului pentru vizualizare
  • Caracteristici ale relatiei
  • Rularea testelor

Instalare

Modul preferat de a instala aceasta extensie este prin intermediul compozitorului.

Fie sa fugi

php composer.phar require –prefer-dist arogachev / yii2-many-to-many

sau adaugati

“arogachev / yii2-many-to-many”: “0.2. *”

la sectiunea de solicitare a fisierului dvs. composer.json.

Caracteristici

  • Configurarea utilizand relatiile hasMany existente
  • Relatii multiple
  • Fara interogari suplimentare. De exemplu, daca initial modelul are 100 de inregistrari conexe, dupa adaugarea unei singure, va fi inserat exact un rand. Daca nu s-a schimbat nimic, nu vor fi executate interogari.
  • Completarea automata a atributului editabil
  • Validator pentru verificarea daca lista primita este valida

Crearea unui atribut editabil

Pur si simplu adaugati proprietati publice la modelul dvs. ActiveRecord astfel:

/ ** * @var array * / public $ editableUsers = [];

Acesta va stoca cheile primare ale inregistrarilor aferente in timpul actualizarii.

Atasarea si configurarea comportamentului

Primul mod este de a specifica in mod explicit toti parametrii:

utilizati arogachev \ ManyToMany \ behaviour \ ManyToManyBehavior; / ** * @inheritdoc * / public function behavior () {return [[‘class’ => ManyToManyBehavior :: className (), ‘relations’ => [[‘editableAttribute’ => ‘editableUsers’, // Editable attribute name ‘table’ => ‘tests_to_users’, // Numele tabelei de jonctiune ‘ownAttribute’ => ‘test_id’, // Numele coloanei din tabela de jonctiuni care reprezinta modelul actual ‘relatedModel’ => Utilizator :: className (), // Clasa modelului asociat ‘relatedAttribute’ => ‘user_id’, // Numele coloanei din tabelul de jonctiuni care reprezinta modelul asociat],],],]; }

Dar, mai des, trebuie sa afisam si modele conexe, deci este mai bine sa definim relatia pentru aceasta si sa o folosim atat pentru afisare, cat si pentru configurarea comportamentului. Ambele moduri (via si viaTable) sunt considerate valide:

Folosind viaTable:

/ ** * @return \ yii \ db \ ActiveQuery * / public function getUsers () {return $ this-> hasMany (User :: className (), [‘id’ => ‘user_id’]) -> viaTable (‘ tests_to_users ‘, [‘ test_id ‘=>’ id ‘]) -> orderBy (‘ nume ‘); }

Utilizarea via (necesita un model suplimentar pentru tabelul de jonctiune):

/ ** * @return \ yii \ db \ ActiveQuery * / functia publica getTestUsers () {return $ this-> hasMany (TestUser :: className (), [‘test_id’ => ‘id’]); } / ** * @return \ yii \ db \ ActiveQuery * / public function getUsers () {return $ this-> hasMany (User :: className (), [‘id’ => ‘user_id’]) -> via ( ‘testUsers’) -> orderBy (‘nume’); }

Comanda nu este necesara.

porno caliente porno online gratis
fontanero cachondo hombres masturbando a mujeres
pajas entre amigos torrent porno
trio amateur español madres viciosas
sexso sexporn
videos porno para mujeres gratis video sexo gratis
xxxgay abuelas folladas por el culo
maduras en grupo sexo maduras españolas
penes de abuelos mamadas españolas
jovencitos follando con maduras sexo muy duro
viejas mexicanas follando tias cachondas
porno español jovencita porno gay trios
follada en la playa tetonas españolas
mamadas en la playa comicxxx
comic porno español castin porno
videos actrices españolas desnudas españolas guarras
videos chicas gratis mamasxxx
masturbacion en grupo pareja española follando
orgias de maduros mamadas gay
incesto abuela y nieto porno online

Apoi treceti doar numele acestei relatii si toti ceilalti parametri vor fi preluati automat.

/ ** * @inheritdoc * / comportamentele functiei publice () {return [[‘class’ => ManyToManyBehavior :: className (), ‘relations’ => [[‘name’ => ‘users’, // Acesta este la fel ca in exemplul anterior ‘editableAttribute’ => ‘editableUsers’,],],],]; }

Relatii suplimentare de la multi la multi pot fi adaugate exact la fel. Retineti ca, chiar si pentru o relatie, ar trebui sa o declarati ca parte a sectiunii relatii.

Completarea relatiilor

In mod implicit, atributul editabil al fiecarui model gasit va fi completat cu ID-urile modelelor conexe (se foloseste incarcarea dornica). Daca doriti mai mult control manual, preveniti interogari suplimentare, dezactivati optiunea de completare automata:

si umpleti-l numai atunci cand este necesar, de exemplu in actiunea de actualizare a controlerului. Acesta este modul recomandat de utilizare.

functie publica actionUpdate ($ id) {$ model = $ this-> findModel ($ id); $ model-> getManyToManyRelation (‘utilizatori’) -> fill (); // …}

Alternativ, puteti specifica conditiile de completare a inchiderii:

‘autoFill’ => function ($ model) {return $ model-> scenariu == Test :: SCENARIO_UPDATE; // valoare booleana}

Chiar si este posibil sa faci asa ceva:

‘autoFill’ => function ($ model) {return Yii :: $ app-> controller-> route == ‘tests / default / update’; }

dar nu este recomandat pentru utilizare deoarece modelul nu este un loc adecvat pentru manipularea rutelor.

Salvarea relatiilor fara atribuire masiva

La crearea modelului:

$ model = test nou; $ model-> editableUsers = [1, 2]; $ model-> save ();

La actualizarea modelului (‘autoFill’ => true):

$ model = test nou; $ model-> editableUsers = [1, 2]; $ model-> save ();

La actualizarea modelului (‘autoFill’ => false, umplere manuala):

$ model = test nou; $ model-> getManyToManyRelation (‘utilizatori’) -> fill (); var_dump ($ model-> editableUsers) // [1, 2] $ model-> editableUsers = [1, 2, 3]; $ model-> save ();

La actualizarea modelului (‘autoFill’ => false, fara umplere manuala):

$ model = test nou; var_dump ($ model-> editableUsers) // matrice goala $ model-> save ();

In acest caz, relatiile dintre multi vor ramane neatinse.

Se adauga atributul ca sigur

Adaugati un atribut editabil la regulile modelului pentru o alocare masiva.

Indicati-l cel putin ca sigur:

reguli de functie publica () {[‘editableUsers’, ‘safe’],}

Sau utilizati validator personalizat:

utilizati arogachev \ ManyToMany \ validators \ ManyToManyValidator; reguli de functie publica () {[‘editableUsers’, ManyToManyValidator :: className ()],}

Validatorul verifica lista pentru a fi matrice si care contine doar chei primare prezentate in modelul asociat. Nu poate fi utilizat fara a atasa ManyToManyBehavior.

Adaugarea controlului pentru vizualizare

Adaugati control pentru a vizualiza pentru gestionarea listei conexe. Fara extensii se poate face cu selectare multipla:

<? = $ formular-> camp ($ model, ‘editableUsers’) -> dropDownList (User :: getList (), [‘multiple’ => true])?>

Exemplu de continut al metodei getList () (trebuie plasat in modelul utilizatorului):

folositi yii \ helpers \ ArrayHelper; / ** * @return array * / public static function getList () {$ models = static :: find () -> orderBy (‘nume’) -> all (); returneaza ArrayHelper :: map ($ models, ‘id’, ‘name’); }

Caracteristici ale relatiei

Puteti accesa relatii de la mai multi la multi astfel:

$ relatie = $ model-> getManyToManyRelation („utilizatori”);

utilizatorii pot fi valoarea fie a proprietatii relatiei de nume, fie a tabelului specificata in config.

Puteti completa EditableAttribute cu ID-uri ale inregistrarilor conexe, astfel:

$ model-> getManyToManyRelation (‘utilizatori’) -> fill ();

Puteti obtine cheile primare adaugate si sterse ale modelelor conexe pentru relatii specifice, cum ar fi:

$ addedPrimaryKeys = $ model-> getManyToManyRelation (‘utilizatori’) -> getAddedPrimaryKeys (); $ deletedPrimaryKeys = $ model-> getManyToManyRelation (‘utilizatori’) -> getDeletedPrimaryKeys ();

Retineti ca acestea sunt disponibile numai dupa ce modelul a fost salvat, astfel incat sa il puteti accesa dupa apelul $ model-> save () sau in handlerul de evenimente afterSave ().

Rularea testelor

Instalati dependente:

Adaugati config de baza de date (fisier tests / config / db-local.php) cu urmatorul continut:

<? php return [‘class’ => ‘yii \ db \ Connection’, ‘dsn’ => ‘mysql: host = localhost; dbname = yii2_many_to_many’, ‘username’ => ‘root’, ‘password’ => ‘ ‘,];

Puteti modifica dbname, numele de utilizator si parola dupa cum doriti. Asigurati-va ca creati baza de date si utilizatorul inainte de a rula testele.

Executati teste: