Laravel 5 is een gloednieuwe versie van het populaire framework. Helaas zijn er nog geen goede multi-tenant setups voor Laravel 5. Daarom heb ik besloten om ook mijn eigen simpele versie te maken, gebaseerd op Welsprekende globale scopes.
In mijn geval wilde ik een sites tabel, met categorieën die een many-to-many relatie hebben. Dus zoiets als:
locaties
id | naam
categorieën
id | naam
site_categorie
id | site_id | categorie_id
Deze tabelstructuur is dus een many-to-many-relatie. Met deze opstelling kunt u een multi-site-opstelling maken met verschillende categorieën. Site A heeft categorieën 1 en 2, Site B heeft categorie 3, etc. Het is in het model als volgt gedefinieerd:
App\Site.php
behoortToMany('App\Categorie', 'site_categorie'); } }
En de categorie zoals:
App\Categorie.php
behoortToMany('App\Site', 'site_categorie'); }
Let op dat deze categorie de trait TenantableTrait toegewezen heeft gekregen. Dat is zoiets als:
App\Traits\TenantableTrait.php
En vergeet ten slotte de wereldwijde reikwijdte van Eloquent niet:
App\TenantScope.php
whereHas('sites', function($query) use($siteId) { $query->where('sites.id', $siteId); }); } } /** * Verwijder de scope van de opgegeven Eloquent query builder. * * @param \Illuminate\Database\Eloquent\Builder $builder * @param \Illuminate\Database\Eloquent\Model $model * @return void */ public function remove(Builder $builder, Model $model) { dd('remove called'); } }Als u nu de site-id per sessie (bijv.) in een controller instelt met:
Sessie::set('siteId', 1)Alle categorieën die een site_category-link met site_id=1 hebben, worden aangeroepen. Zoals u ziet, moet de remove-methode nog worden gespecificeerd, dus als u dit script wilt afmaken, laat het dan achter in de opmerkingen.
Je kunt dit herhalen met site_products of waarschijnlijk zelfs site_category_product (met wat aanpassingen, laat het me hieronder weten als dat werkt 🙂 ).
Kijk eens naar https://github.com/AuraEQ/laravel-multi-tenant
Hoi Rik,
Voor zover ik weet ondersteunt die plugin Laravel 5 niet. Als jij een betere oplossing hebt, laat het me weten!
Bedankt, dit is een geweldige oplossing 🙂
Waarvoor dient de verwijderfunctie?
Hoe zou je het afmaken?
Betekent dit dat site_id in elke migratie-/databasetabel staat?
Nee, alleen degenen die de Eigenschap hebben.