Laravel 4 BelongsToMany метод sync () не работает должным образом

У меня проблема при использовании метода sync (). Пожалуйста, помогите мне здесь.

У меня есть три таблицы, как показано ниже.

Таблица: tbl_roles

+----------------+------------------+------+-----+---------+----------------+
| Field          | Type             | Null | Key | Default | Extra          |
+----------------+------------------+------+-----+---------+----------------+
| id_role        | int(10) unsigned | NO   | PRI | NULL    | auto_increment |
| name           | varchar(60)      | NO   | UNI | NULL    |                |
| description    | text             | YES  |     | NULL    |                |
+----------------+------------------+------+-----+---------+----------------+

Таблица: tbl_permissions

+----------------+------------------+------+-----+---------+----------------+
| Field          | Type             | Null | Key | Default | Extra          |
+----------------+------------------+------+-----+---------+----------------+
| id_permission  | int(10) unsigned | NO   | PRI | NULL    | auto_increment |
| name           | varchar(255)     | NO   |     | NULL    |                |
| description    | text             | YES  |     | NULL    |                |
+----------------+------------------+------+-----+---------+----------------+

Таблица: tbl_link_roles_permissions

+---------------+------------------+------+-----+---------+-------+
| Field         | Type             | Null | Key | Default | Extra |
+---------------+------------------+------+-----+---------+-------+
| id_role       | int(10) unsigned | NO   | MUL | NULL    |       |
| id_permission | int(10) unsigned | NO   | MUL | NULL    |       |
+---------------+------------------+------+-----+---------+-------+

Я создал отношения "многие ко многим" между ролями и моделями разрешений.

Ролевая модель:

class Role extends Eloquent
{
    /**
     * Permissions
     */
    public function permissions()
    {
        return $this->belongsToMany('Permission', 'tbl_link_roles_permissions', 'id_role', 'id_role');
    }
}

Модель разрешений:

class Permission extends Eloquent
{
    /**
     * Roles
     */
    public function roles()
    {
        return $this->belongsToMany('Role', 'tbl_link_roles_permissions', 'id_permission', 'id_permission');
    }
}

Когда я запускаю следующий код для синхронизации разрешений ролей. Это дает мне ошибку нарушения ограничения целостности.

Код:

    $role = Role::find($id_role);

    $permissions = Input::get('role_permissions');

    /* 
     * Permissions array is like array('1','2','3')
     * So I convert the value to integer.
     */
    $parameters = array();

    foreach($permissions as $permission) {
        $parameters[] = intval($permission);
    }

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

Согласно сообщению об ошибке, я обнаружил, что запрос SQL неверен.

Сообщение об ошибке:

SQLSTATE[23000]: Integrity constraint violation: 1452 Cannot add or update a child row: 
a foreign key constraint fails (`quidz_host_laravel`.`tbl_link_roles_permissions`, 
CONSTRAINT `tbl_link_roles_permissions_id_permission_foreign` FOREIGN KEY 
(`id_permission`) REFERENCES `tbl_permissions` (`id_permission`)) (SQL: insert into 
`tbl_link_roles_permissions` (`id_role`) values (?)) (Bindings: array ( 0 => 1, ))

Он только вставляет id_role. Это не то, что я хочу. Кто-нибудь может сказать мне, что я сделал не так?

Большое спасибо.


person Jonathan    schedule 31.07.2013    source источник


Ответы (1)


Я решил свою проблему. Это вызвано передачей неверных параметров при построении отношений.

Отношения должны быть такими, как в приведенном ниже коде:

class Role extends Eloquent
{
    /**
     * Permissions
     */
    public function permissions()
    {
        return $this->belongsToMany('Permission', 'tbl_link_roles_permissions', 'id_role', 'id_permission');
    }
}

class Permission extends Eloquent
{
    /**
     * Roles
     */
    public function roles()
    {
        return $this->belongsToMany('Role', 'tbl_link_roles_permissions', 'id_permission', 'id_role');
    }
}
person Jonathan    schedule 31.07.2013