Laravel 5 is a brand new version of the popular framework. Unfortunately, there are no good multi-tenant setups for Laravel 5 yet. That’s why I’d decided to create my own simple version as well, based on Eloquent Global Scopes.
In my case I wanted a sites table, with categories that have a many to many relationship. So like:
sites
id | name
categories
id | name
site_category
id | site_id | category_id
So this table structure is a many to many relation. With this setup you can create a multi-site setup with different categories. Site A has categories 1 and 2, Site B has category 3 etc. It’s defined in the model as follows:
App\Site.php
belongsToMany('App\Category', 'site_category'); } }
And the category like:
App\Category.php
belongsToMany('App\Site', 'site_category'); }
Notice that this category has the trait TenantableTrait assigned. That is like:
App\Traits\TenantableTrait.php
And finally, don't forget the global Eloquent scope:
App\TenantScope.php
<?php namespace App; use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Builder; use Illuminate\Database\Eloquent\ScopeInterface; use Session; class TenantScope implements ScopeInterface { /** * Apply the scope to a given Eloquent query builder. * * @param \Illuminate\Database\Eloquent\Builder $builder * @param \Illuminate\Database\Eloquent\Model $model * @return void */ public function apply(Builder $builder, Model $model) { if (Session::has('siteId')) { $siteId = session('siteId'); $builder->whereHas('sites', function($query) use($siteId) { $query->where('sites.id', $siteId); }); } } /** * Remove the scope from the given 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'); } }Now, if you set the site id by session (e.g.) in a controller with:
Session::set('siteId', 1)A all categories that have a site_category link with site_id=1 will be called. As you see, the remove method still has to be specified, so if you'd like to finish up this script, leave it in the comments.
You can repeat this with site_products or probably even site_category_product (with some finetuning, if that works, let me know below 🙂 ).
Have a look at https://github.com/AuraEQ/laravel-multi-tenant
Hi Rik,
As far as I know that plugin doesn’t support Laravel 5. If you’ve a better solution, let me know!
Thanks, this is a great solution 🙂
What is the remove function for?
How would you go about finishing it up?
Does this mean site_id is in every migration/db table?
no, only the ones that have the Trait.