Introducere

Aceasta extensie Laravel Eloquent adauga suport pentru cheile straine JSON la relatiile BelongsTo, HasOne, HasMany, HasOneThrough, HasManyThrough, MorphTo, MorphOne si MorphMany.

De asemenea, ofera relatii de la multi la multi cu tablourile JSON.

Compatibilitate

Baza de date Laravel MySQL 5.7+ 5.5.29+ MariaDB 10.2+ 5.8+ PostgreSQL 9.3+ 5.5.29+ SQLite 3.18+ 5.6.35+ SQL Server 2016+ 5.6.25+

Instalare

compozitorul necesita „staudenmeir / eloquent-json-relations: ^ 1.1”

Utilizare

  • Relatii intre multi
    • Integritate referentiala
  • Relatii Multe-Multe
    • Matrice de ID-uri
    • Matrice de obiecte
    • Performanta interogare

Relatii intre multi

In acest exemplu, Utilizatorul are o relatie din partea Locale.

peliculas porno gay en español porno gratis anal
mama me folla me follo a mi madrastra
chicas altas follando rusas desnudas
videos de lucio saints maduras en grupo
viejas cachondas orgias rusas
comic maduras videos actrices españolas desnudas
mi vecina me folla chicas corriendose a chorros
peliculas porno castellano sobar tetas
videos porno tetonas gratis follando en tenerife
tias cachondas tetas en publico
porno viejas en español porno español años 70
orgias amateur pollas corriendose
me follo a mi madre videos x incesto
corridas internas peludas mi mujer follando
videos ponos abuelas ardientes
tias corriendose transexual española follando
coñosxxx mamadas por dinero
follando despues de la fiesta maria patiño desnuda
porno casero real español milfs españolas
incesto asiatico mamada a caballo

Nu exista o coloana dedicata, dar cheia straina (locale_id) este stocata ca o proprietate intr-un camp JSON (users.options):

clasa User extinde Model {use \ Staudenmeir \ EloquentJsonRelations \ HasJsonRelationships; protejat $ cast = = ” options ‘=>’ json ‘,]; locale functie publica () {return $ this-> belongTo (‘App \ Locale’, ‘options-> locale_id’); }} class Locale extinde Model {use \ Staudenmeir \ EloquentJsonRelations \ HasJsonRelationships; utilizatorii functiei publice () {return $ this-> hasMany (‘App \ User’, ‘options-> locale_id’); }}

Nu uitati sa utilizati trasatura HasJsonRelationships atat in ​​parinte, cat si in modelul inrudit.

Integritate referentiala

Pe MySQL, MariaDB si SQL Server puteti asigura in continuare integritatea referentiala cu cheile straine pe coloanele generate / calculate.

Migrarile Laravel accepta aceasta caracteristica pe MySQL / MariaDB:

Schema :: create (‘utilizatori’, functie (Blueprint $ table) {$ table-> bigIncrements (‘id’); $ table-> json (‘options’); $ locale_id = DB :: connection () -> getQueryGrammar () -> wrap (‘options-> locale_id’); $ table-> unsignedInteger (‘locale_id’) -> storedAs ($ locale_id); $ table-> strain (‘locale_id’) -> referinte (‘id’) -> pe (‘locale’);});

Migrarile Laravel (5.7.25+) accepta, de asemenea, aceasta caracteristica pe SQL Server:

Schema :: create (‘utilizatori’, functie (Blueprint $ table) {$ table-> bigIncrements (‘id’); $ table-> json (‘options’); $ locale_id = DB :: connection () -> getQueryGrammar () -> wrap (‘options-> locale_id’); $ locale_id = ‘CAST (‘. $ locale_id. ‘AS INT)’; $ table-> calculat (‘locale_id’, $ locale_id) -> persisted (); $ tabel-> strain (‘locale_id’) -> referinte (‘id’) -> pe (‘locale’);});

Exista o solutie pentru versiunile mai vechi ale Laravel.

Relatii Multe-Multe

Pachetul introduce, de asemenea, doua noi tipuri de relatii: BelongsToJson si HasManyJson

In Laravel 5.6.25+, le puteti utiliza pentru a implementa relatii de la mai multe la multe cu matricele JSON.

In acest exemplu, Utilizatorul are o relatie BelongsToMany cu Role. Nu exista tabel pivot, dar cheile straine sunt stocate ca matrice intr-un camp JSON (users.options):

Matrice de ID-uri

In mod implicit, relatia stocheaza inregistrarile pivot ca o serie de ID-uri:

clasa User extinde Model {use \ Staudenmeir \ EloquentJsonRelations \ HasJsonRelationships; protejat $ cast = = ” options ‘=>’ json ‘,]; rolurile functiei publice () {return $ this-> belongToJson (‘App \ Role’, ‘options-> role_ids’); }} class Role extinde Model {use \ Staudenmeir \ EloquentJsonRelations \ HasJsonRelationships; utilizatorii functiei publice () {return $ this-> hasManyJson (‘App \ User’, ‘options-> role_ids’); }}

Pe partea relatiei BelongsToJson, puteti utiliza atasare (), detasare (), sincronizare () si comutare ():

$ utilizator = utilizator nou; $ utilizator-> roluri () -> atasare ([1, 2]) -> salvare (); // Acum: [1, 2] $ utilizator-> roluri () -> detasare ([2]) -> salvare (); // Acum: [1] $ utilizator-> roluri () -> sincronizare ([1, 3]) -> salvare (); // Acum: [1, 3] $ utilizator-> roluri () -> comutare ([2, 3]) -> salvare (); // Acum: [1, 2]

Matrice de obiecte

De asemenea, puteti stoca inregistrari pivot ca obiecte cu atribute suplimentare:

clasa User extinde Model {use \ Staudenmeir \ EloquentJsonRelations \ HasJsonRelationships; protejat $ cast = = ” options ‘=>’ json ‘,]; roluri de functie publica () {return $ this-> belongToJson (‘App \ Role’, ‘options-> roles [] -> role_id’); }} clasa Rolul extinde Modelul {use \ Staudenmeir \ EloquentJsonRelations \ HasJsonRelationships; utilizatorii functiei publice () {return $ this-> hasManyJson (‘App \ User’, ‘options-> roles [] -> role_id’); }}

Aici, optiuni-> roluri este calea catre matricea JSON. role_id este numele proprietatii cheii straine din interiorul obiectului de inregistrare:

$ utilizator = utilizator nou; $ utilizator-> roluri () -> atasare ([1 => [‘activ’ => adevarat], 2 => [‘activ’ => fals]]) -> salvare (); // Acum: [{“role_id”: 1, “active”: true}, {“role_id”: 2, “active”: false}] $ user-> roles () -> detach ((2)) -> Salvati(); // Acum: [{“role_id”: 1, “active”: true}] $ utilizator-> roluri () -> sincronizare ([1 => [‘active’ => false], 3 => [‘active’) => adevarat]]) -> salvare (); // Acum: [{“role_id”: 1, “active”: false}, {“role_id”: 3, “active”: true}] $ user-> roles () -> toggle ([2 => [‘ activ ‘=> adevarat], 3]) -> salvare (); // Acum: [{“role_id”: 1, “active”: false}, {“role_id”: 2, “active”: true}]

Limitari: pe SQLite si SQL Server, aceste relatii functioneaza doar partial.

Performanta interogare

Pe PostgreSQL, puteti imbunatati performanta interogarii cu coloane jsonb si indexuri GIN.

Utilizati aceasta migratie atunci cand matricea de ID-uri / obiecte este coloana insasi (de exemplu, users.role_ids):

Schema :: create (‘utilizatori’, functie (Blueprint $ table) {$ table-> bigIncrements (‘id’); $ table-> jsonb (‘role_ids’); $ table-> index (‘role_ids’, null, ‘gin’); });

Utilizati aceasta migratie atunci cand matricea este cuibarita in interiorul unui obiect (de exemplu, utilizatori.optiuni-> rol_id):

Schema :: create (‘utilizatori’, functie (Blueprint $ table) {$ table-> bigIncrements (‘id’); $ table-> jsonb (‘options’); $ table-> rawIndex (‘(“options” – > \ ‘role_ids \’) ‘,’ users_options_index ‘) -> algorithm (‘ gin ‘); // Laravel 7.10.3+ // $ table-> index ([DB :: raw (‘ (“options” -> \ ‘role_ids \’) ‘)],’ users_options_index ‘,’ gin ‘); // Laravel <7.10.3});

Contribuind

Va rugam sa consultati CONTRIBUTIA si CODUL DE CONDUITA pentru detalii.