Kohana 3.2 ORM «многие ко многим» — неправильные имена полей

Я пытаюсь установить связь «многие ко многим» между двумя моделями: Users_Role и Users_Right.

class Model_Users_Role extends ORM{
    protected $_has_many = array(
        'rights' => array(
            'model'   => 'users_right',
            'through' => 'users_roles_rights',
        ),
    ); 
}

class Model_Users_Right extends ORM{    
    protected $_has_many = array(
        'roles' => array(
            'model'   => 'users_role',
            'through' => 'users_roles_rights',
        ),
    );
}

Я пытаюсь сделать это:

$role = ORM::factory('users_role', 1);
$right = ORM::factory('users_right', 1);
$right->add('roles', $role);

Ошибка:

Database_Exception [ 1054 ]: Unknown column 'role_id' in 'field list' [ INSERT INTO `users_roles_rights` (`users_right_id`, `role_id`) VALUES ('1', '1') ]

Я попытался сделать это с другой стороны:

$role = ORM::factory('users_role', 1);
$right = ORM::factory('users_right', 1);        
$role->add('rights', $right);

Новая ошибка:

Database_Exception [ 1054 ]: Unknown column 'right_id' in 'field list' [ INSERT INTO `users_roles_rights` (`users_role_id`, `right_id`) VALUES ('1', '1') ]

Я ожидал, что ORM будет использовать имена полей users_role_id и users_right_id в сводной таблице, но он использует неправильное имя дальнего ключа? Где я сделал ошибку?


person user1151990    schedule 17.01.2012    source источник
comment
Я добавил 'far_key' в массив, данные были успешно добавлены. Но если я попытаюсь добавить одно и то же отношение во второй раз, kohana добавит еще одну такую ​​же строку в сводную таблицу. Почему?   -  person user1151990    schedule 18.01.2012


Ответы (1)


Проверьте, где установлены значения по умолчанию. Попробуй это:

class Model_Users_Role extends ORM{
    protected $_has_many = array(
        'rights' => array(
            'model'   => 'users_right',
            'far_key' => 'users_right_id',
            'through' => 'users_roles_rights',
        ),
    ); 
}

class Model_Users_Right extends ORM{    
    protected $_has_many = array(
        'roles' => array(
            'model'   => 'users_role',
            'far_key' => 'users_role_id',
            'through' => 'users_roles_rights',
        ),
    );
}

Кохана не проверяет, что отношения еще не существуют.

Либо примените это в таблице базы данных с помощью составного уникального ключа в двух столбцах внешнего ключа, либо сделайте так, чтобы ваш код проверял, что отношение еще не существует перед добавлением.

person Lethargy    schedule 18.01.2012