Laravel 5 är en helt ny version av det populära ramverket. Tyvärr finns det inga bra multi-tenant-inställningar för Laravel 5 än. Det är därför jag hade bestämt mig för att skapa min egen enkla version också, baserad på Talande globala omfattningar.
I mitt fall ville jag ha en webbplatstabell, med kategorier som har många till många relationer. Så som:
webbplatser
id | namn
kategorier
id | namn
site_category
id | site_id | kategori_id
Så den här tabellstrukturen är en många till många relation. Med denna inställning kan du skapa en multi-site setup med olika kategorier. Webbplats A har kategori 1 och 2, webbplats B har kategori 3 osv. Den definieras i modellen enligt följande:
App\Site.php
belongsToMany('App\Category', 'site_category'); } }
Och kategorin som:
App\Category.php
belongsToMany('App\Site', 'site_category'); }
Observera att denna kategori har egenskapen TenantableTrait tilldelad. Det är som:
App\Traits\TenantableTrait.php
<?php namespace App\Traits;
use App\TenantScope;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\ModelNotFoundException;
trait TenantableTrait {
/**
* Boot the tenantable trait for the model
*
* @return void
*/
public static function bootTenantableTrait()
{
static::addGlobalScope(new TenantScope);
}
}
Och slutligen, glöm inte det globala Eloquent-omfattningen:
App\TenantScope.php
whereHas('sites', function($query) use($siteId) { $query->where('sites.id', $siteId); }); } } /** * Ta bort omfånget från den givna Eloquent-frågebyggaren. * * @param \Illuminate\Database\Eloquent\Builder $builder * @param \Illuminate\Database\Eloquent\Model $model * @return void */ public function remove(Builder $builder, Model $model) { called'('remove) } }
Nu, om du ställer in plats-id efter session (t.ex.) i en kontroller med:
Session::set('siteId', 1)
A alla kategorier som har en site_category-länk med site_id=1 kommer att anropas. Som du ser måste borttagningsmetoden fortfarande specificeras, så om du vill avsluta det här skriptet, lämna det i kommentarerna.
Du kan upprepa detta med site_products eller förmodligen till och med site_category_product (med lite finjustering, om det fungerar, låt mig veta nedan 🙂 ).
Senast uppdaterad 30 mars 2015
Ta en titt på https://github.com/AuraEQ/laravel-multi-tenant
Hej Rik,
Så vitt jag vet stöder inte plugin Laravel 5. Om du har en bättre lösning, låt mig veta!
Tack, det här är en bra lösning 🙂
Vad är borttagningsfunktionen till för?
Hur skulle du gå tillväga för att avsluta det?
Betyder detta att site_id finns i varje migration/db-tabell?
nej, bara de som har egenskapen.