Laravel 5: semplice configurazione del modello multi-tenant/multi-sito (coperto anche dalla relazione molti-a-molti)

Illustrazione della barra di navigazione multi-tenant multisito LaravelLaravel 5 è una nuovissima versione del famoso framework. Sfortunatamente, non ci sono ancora buone configurazioni multi-tenant per Laravel 5. Ecco perché ho deciso di creare anche la mia versione semplice, basata su Ambiti globali eloquenti.

Nel mio caso volevo una tabella dei siti, con categorie che hanno una relazione molti a molti. Quindi:

siti
ID | nome

categorie
ID | nome

categoria_sito
id | id_sito | id_categoria

Quindi questa struttura di tabella è una relazione molti a molti. Con questa configurazione puoi creare una configurazione multi-sito con categorie diverse. Il sito A ha le categorie 1 e 2, il sito B ha la categoria 3 ecc. È definito nel modello come segue:

App\Sito.php

belongsToMany('App\Categoria', 'categoria_sito'); } }

E la categoria come:

App\Categoria.php

belongsToMany('App\Sito', 'categoria_sito'); }

Nota che questa categoria ha il tratto TenantableTrait assegnato. È come:

App\Tratti\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);
    }

}

E infine, non dimenticare la portata globale di Eloquent:

App\TenantScope.php

whereHas('siti', function($query) use($siteId) { $query->where('siti.id', $siteId); }); } } /** * Rimuovi l'ambito dal generatore di query Eloquent specificato. * * @param \Illuminate\Database\Eloquent\Builder $builder * @param \Illuminate\Database\Eloquent\Model $model * @return void */ public function remove(Builder $builder, Model $model) { dd('rimuovi chiamato'); } }

Ora, se si imposta l'ID del sito per sessione (ad esempio) in un controller con:

Sessione::set('siteId', 1)

Verranno chiamate tutte le categorie che hanno un collegamento site_category con site_id=1. Come vedi, il metodo remove deve ancora essere specificato, quindi se vuoi terminare questo script, lascialo nei commenti.

Puoi ripetere questa operazione con site_products o forse anche site_category_product (con qualche piccola modifica, se funziona fammelo sapere qui sotto 🙂 ).

Ultimo aggiornamento il 30 marzo 2015

6 commenti su “Laravel 5: simple multi-tenant/multi-site model setup (many-to-many relation covered as well)”

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *

it_ITItaliano
Scorri verso l'alto