Pereiti prie turinio

Laravel - Dinamiškai pridėti Eloquent Relationship'ą


Rekomenduojami pranešimai

Sveiki,

 

Ar įmanoma į Eloquent Model'į dinamiškai prirašyti relationship'ą? Tarkim jei turiu Page modelį, ir noriu pridėti banners() santykį, nekeičiant pačio modelio failo? Kažkas tokio jog būtų:

 

Page::createRelationship('banners', function(){
   $this->hasMany('banners');
});

 

Dėkui

Nuoroda į pranešimą
Dalintis kituose puslapiuose

public function banners(){

return $this->hasMany('App\Banner');

}

 

Sveiki,

 

Ar įmanoma į Eloquent Model'į dinamiškai prirašyti relationship'ą? Tarkim jei turiu Page modelį, ir noriu pridėti banners() santykį, nekeičiant pačio modelio failo? Kažkas tokio jog būtų:

 

Page::createRelationship('banners', function(){
   $this->hasMany('banners');
});

 

Dėkui

Nuoroda į pranešimą
Dalintis kituose puslapiuose

O elementari fcija su parametru, kuri grazina relationshipa pagal prametra neveikia?

Function dynamic($model) {return $this->hasMany($model) ;}

 

Ne, kadangi man reiktų jog relationship'as veiktų kaip visi kiti, t.y. kad galėčiau pvz. iškviesti $page->banners ir man grąžintų susijusius modelius.

Nuoroda į pranešimą
Dalintis kituose puslapiuose

Na neisivaizduoju, kodel cia tau reik taip, bet cia gali paieskot metodo https://laravel.com/api/5.3/Illuminate/Database/Eloquent/Relations/Relation.html

 

Kadangi sistema sukurta iš skirtingų modulių, man reikia jog kai kurie modeliai 'pratęstų' kitus modulius, nekeičiant pradinių modulių kodo :)

Nuoroda į pranešimą
Dalintis kituose puslapiuose

Parasai nauja modeli, kuris extendina orginalu ir nesuki galvos?

 

Nelabai tinka struktūr. Tarkim turiu Page modelį, turiu PageBanners modelį, ir PageFiles modelį. Extendinant, man reiktų rašyti maždaug class PageWithBannersWithFiles extends Page. Ir tai, kai kurie saitai turės PageFiles modelį, kai kurie ne, ir struktūra labai greit subyrės jei kiekvienas modulis extendins visus kitus modulius. Todėl ir ieškau sprendimo, kaip kiekvienas modulis gali pridėti reikiama funkcionalumą į kitus modulius nelaužant jų, ir betkada išjungus modulį kiti moduliai nesulūš.

Nuoroda į pranešimą
Dalintis kituose puslapiuose

Kaip ir sako, gali bandyti extendinti modelį arba tiesiog funkcionalumą papildyti su trait'u. O šiaip tai modelių pavadinimai sako, kad ten padaryta kažkokia "x...nia". Turi būti maždaug taip:

 

File - failų modelis

Page - puslapių modelis

Banner - banerių modelis

 

ir t.t.

 

Extendinant tiesiog vėl rašai:

 

namespace App\CustomModels;

use App\Models\Page as PageModel

class Page extends PageModel

 

Nereikia ten tų with prirašinėti.

 

EDIT: kaip suprantu nori iš vieno "Page" modelio pasiimti ir failus ir banerius, bet dabar turi du modelius? Visu pirma pradžioje nereikėjo kurti tam dviejų skirtingų modelių, o jeigu jau taip buvo, tai trink tu juos ir tvarkykis normaliai, nes visi relationshipai gali būti sudėti ir į vieną. Nereikia kurtis atskirų modelių ir jų pavadinimuose aprašyti visus relationshipus :D

 


class Page extends Model 
{
   public function banners()
   {
       return $this->hasMany('App\Models\Banner');
   }

   public function files()
   {
       return $this->hasMany('App\Models\File');
   }
}

 

Dar vienas variantas, jeigu jau per daug darbo viską keisti, tai susikurk kažkokį "MainModel" ir visus modelius extendink į pastarąjį, o pastarąjį į Model. Ir tame "MainModel" rašyk funcionalumą, kurį galėsi pasiekti iš visų kitų modelių. Pvz:

 


class MainModel extends Model {} // Model --> Illuminate\Database\Eloquent\Model

class PageBanner extends MainModel {}

class PageFiles extends MainModel {}

Redagavo FaceToFace
Nuoroda į pranešimą
Dalintis kituose puslapiuose

Kaip ir sako, gali bandyti extendinti modelį arba tiesiog funkcionalumą papildyti su trait'u. O šiaip tai modelių pavadinimai sako, kad ten padaryta kažkokia "x...nia". Turi būti maždaug taip:

 

File - failų modelis

Page - puslapių modelis

Banner - banerių modelis

 

ir t.t.

 

Extendinant tiesiog vėl rašai:

 

namespace App\CustomModels;

use App\Models\Page as PageModel

class Page extends PageModel

 

Nereikia ten tų with prirašinėti.

 

EDIT: kaip suprantu nori iš vieno "Page" modelio pasiimti ir failus ir banerius, bet dabar turi du modelius? Visu pirma pradžioje nereikėjo kurti tam dviejų skirtingų modelių, o jeigu jau taip buvo, tai trink tu juos ir tvarkykis normaliai, nes visi relationshipai gali būti sudėti ir į vieną. Nereikia kurtis atskirų modelių ir jų pavadinimuose aprašyti visus relationshipus :D

 


class Page extends Model 
{
   public function banners()
   {
       return $this->hasMany('App\Models\Banner');
   }

   public function files()
   {
       return $this->hasMany('App\Models\File');
   }
}

 

Dar vienas variantas, jeigu jau per daug darbo viską keisti, tai susikurk kažkokį "MainModel" ir visus modelius extendink į pastarąjį, o pastarąjį į Model. Ir tame "MainModel" rašyk funcionalumą, kurį galėsi pasiekti iš visų kitų modelių. Pvz:

 


class MainModel extends Model {} // Model --> Illuminate\Database\Eloquent\Model

class PageBanner extends MainModel {}

class PageFiles extends MainModel {}

 

Traitas netinka, kadangi vėl kartoju, jog pagrindinio modulio (Pages) keisti negalima. Aš suprantu, kad galiu ir 10 relationship'ų rašyt į tą failą. Tačiau man failo keisti negalima. Kadangi sistema sudėta iš modulių, kurie turi savo versijas atskirai, aš negaliu sukurti modulio, kuris turės priklausomybė nuo to ar 'Pages' modulis buvo update'intas ir turi banners() metodą ar ne.

 

Va paskutinį tavo variantą turbūt ir darysim. Pasirašiau dinamiškus relationship'us pačiam frameworke, galbūt darysiu Pull Request, pažiūrėsiu ar žmonės mano, jog naudinga būtų tokia funkcija. Jeigu ne, persikelsiu metodus į naują bazinį Modelį.

 

Dėkui.

Nuoroda į pranešimą
Dalintis kituose puslapiuose

Prisijunkite prie diskusijos

Jūs galite rašyti dabar, o registruotis vėliau. Jeigu turite paskyrą, prisijunkite dabar, kad rašytumėte iš savo paskyros.

Svečias
Parašykite atsakymą...

×   Įdėta kaip raiškusis tekstas.   Atkurti formatavimą

  Only 75 emoji are allowed.

×   Nuorodos turinys įdėtas automatiškai.   Rodyti kaip įprastą nuorodą

×   Jūsų anksčiau įrašytas turinys buvo atkurtas.   Išvalyti redaktorių

×   You cannot paste images directly. Upload or insert images from URL.

Įkraunama...
  • Dabar naršo   0 narių

    Nei vienas registruotas narys šiuo metu nežiūri šio puslapio.

  • Prisijunk prie bendruomenės dabar!

    Uždarbis.lt nariai domisi verslo, IT ir asmeninio tobulėjimo temomis, kartu sprendžia problemas, dalinasi žiniomis ir idėjomis, sutinka būsimus verslo partnerius ir dalyvauja gyvuose susitikimuose.

    Užsiregistruok dabar ir galėsi:

    ✔️ Dalyvauti diskusijose;

    ✔️ Kurti naujas temas;

    ✔️ Rašyti atsakymus;

    ✔️ Vertinti kitų žmonių pranešimus;

    ✔️ Susisiekti su bet kuriuo nariu asmeniškai;

    ✔️ Naudotis tamsia dizaino versija;

    ir dar daugiau.

    Registracija trunka ~30 sek. ir yra visiškai nemokama.

  • Naujausios temos

  • Karštos temos

×
×
  • Pasirinkite naujai kuriamo turinio tipą...