2016-03-06 20 views
5

ho due seguenti 2 modelli in molti-a-molti:Salvataggio della relazione molti a molti, sincronizzazione/collegamento non esiste?

use Illuminate\Database\Eloquent\Model; 

class Permission extends Model 
{ 
    /** 
    * The database table used by the model. 
    * 
    * @var string 
    */ 
    protected $table = 'permissions'; 

    /* 
    |-------------------------------------------------------------------------- 
    | Relationship Methods 
    |-------------------------------------------------------------------------- 
    */ 

    /** 
    * many-to-many relationship method 
    * 
    * @return QueryBuilder 
    */ 
    public function roles() 
    { 
     return $this->belongsToMany('App\Admin\Role'); 
    } 

} 

e

class Role extends Model 
{ 
    /** 
    * The database table used by the model. 
    * 
    * @var string 
    */ 
    protected $table = 'roles'; 

    /* 
    |-------------------------------------------------------------------------- 
    | Relationship Methods 
    |-------------------------------------------------------------------------- 
    */ 

    /** 
    * many-to-many relationship method. 
    * 
    * @return QueryBuilder 
    */ 
    public function users() 
    { 
     return $this->belongsToMany('App\Admin\User'); 
    } 

    /** 
    * many-to-many relationship method. 
    * 
    * @return QueryBuilder 
    */ 
    public function permissions() 
    { 
     return $this->belongsToMany('App\Admin\Permission'); 
    } 
} 

Quello che sto cercando di fare qui, è quello di creare una pagina in cui nuovo ruolo può essere creato, e associo quel ruolo delle autorizzazioni già create:

@foreach ($permissions as $permission) 
          <label class="checkbox"> 
           <input type="checkbox" value="{{ $permission->id }}" name="permissions[]" id="permission_{{ $permission }} }}"> 
           {{ $permission->permission_title }} 
          </label> 
         @endforeach 

e nel controller ho provato questo per estrarre i permessi selezionati dalla pagina e salvare ogni cosa:

// logic to save role 
$role->save(); 
$permissions = Input::get('permissions'); 
$role->permissions->sync($permissions); 

Tuttavia dopo l'ultima istruzione viene eseguita ottengo il seguente errore: exception 'BadMethodCallException' with message 'Method sync does not exist. ' Lo stesso errore che ottengo per attach pure. Inoltre, non sono sicuro se dovrei fornire da qualche parte il nome del tavolo intermedio permission_role? Grazie.

risposta

9

è necessario utilizzare il seguente:

$role->permissions()->sync($permissions); 

non dimenticare il ()

EDIT: Alcuni ulteriori spiegazioni:

$role->permissions è un'istanza Collection.

$role->permissions() è un'istanza belongsToMany, che contiene il metodo sync()

+0

Funziona anche senza '()' –

+2

No, non ho appena testato ed ha ottenuto lo stesso errore esatto senza il '()'. Questo perché '$ role-> permissions' è un'istanza di Collection, e' $ role-> permissions() 'è un'istanza di OwnToMany che contiene il metodo' sync() ':) – Hammerbot

+0

Grazie, è tutto. – Zed