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

Posted

技术标签:

【中文标题】保存多对多关系,同步/附加不存在?【英文标题】:Saving many-to-many relationship, sync/attach doesn't exist? 【发布时间】:2016-06-20 00:15:46 【问题描述】:

我在多对多关系中有两个以下 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');
    


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

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

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

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

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

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

【问题讨论】:

【参考方案1】:

您需要使用以下内容:

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

别忘了()

编辑:更多解释:

$role-&gt;permissions 是一个集合实例。

$role-&gt;permissions() 是一个包含sync() 方法的belongsToMany 实例

【讨论】:

以上是关于保存多对多关系,同步/附加不存在?的主要内容,如果未能解决你的问题,请参考以下文章

不存在多对多关系。它在不同的架构中

Symfony 3.4 - 如果在多对多关系上不存在,则持续存在

Laravel 多对多关系在哪里保存项目总数? [关闭]

Laravel 多对多同步与附加列

查询是不是存在多个多对多关系

在 laravel 中使用多对多关系同步:PostgreSQL 数据透视表不更新