保存多对多关系,同步/附加不存在?

Zed*_*Zed 11 php laravel lumen

我有两个跟随2个模型的多对多关系:

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');
    }

}
Run Code Online (Sandbox Code Playgroud)

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');
    }
}
Run Code Online (Sandbox Code Playgroud)

我在这里要做的是创建一个可以创建新角色的页面,并将该角色与已创建的权限相关联:

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

在控制器中,我尝试从页面中提取所选权限并保存所有内容:

// logic to save role
$role->save();
$permissions = Input::get('permissions');
$role->permissions->sync($permissions);
Run Code Online (Sandbox Code Playgroud)

但是,在执行完最后一条语句后,我收到以下错误: exception 'BadMethodCallException' with message 'Method sync does not exist.'同样的错误也是我得到的attach.另外,我不确定我是否应该在某处提供中间表的名称permission_role?谢谢.

Ham*_*bot 25

您需要使用以下内容:

$role->permissions()->sync($permissions);
Run Code Online (Sandbox Code Playgroud)

别忘了 ()

编辑:更多解释:

$role->permissions 是一个Collection实例.

$role->permissions()belongsToMany包含该sync()方法的实例

  • 不,它不是我刚刚测试并且在没有`()`的情况下得到完全相同的错误.那是因为`$ role-> permissions`是一个Collection实例,`$ role-> permissions()`是一个包含`sync()`方法的belongsToMany实例:) (4认同)