При проектировании отношения в Datamapper каждый должен называть отношение тем же именем, что и связанный объект, что не слишком удобно, когда в качестве имени класса используется что-то вроде Application_Model_User
. Для тех из вас, кто поспешит сказать, что есть опция конфигурации с ключом «класс», я знаю. Был там попробовал это. Он работает только для получения связанных объектов, а не для их обновления.
Вот фрагмент кода для воспроизведения проблемы:
// User Model
class UserModel extends Datamapper
{
public $table = 'users';
public $has_many = array(
'roles' => array(
'class' => 'RoleModel',
'other_field' => 'usermodel',
'join_other_as' => 'role',
'join_self_as' => 'user',
'join_table' => 'users_roles'
),
);
}
class RoleModel extends DataMapper
{
public $table = 'roles';
public $has_many = array(
'usermodel' => array('class' => 'UserModel',
'other_field' => 'roles',
'join_other_as'=> 'user',
'join_self_as' => 'role',
'join_table' => 'users_roles' )
);
}
// controller code. Make sure you have a role with INT id = 2, and a user with INT id = 5 in your db
$user = new UserModel(2);
$role = new RoleModel(5);
$user->save($role);
Этот код выдает «Невозможно связать пользовательскую модель с ролевой моделью». ошибка, однако она работает должным образом (то есть новая запись вставляется в таблицу объединения user_roles
), если отношение переименовано из "role" в "rolemodel".
Итак, если есть какие-либо заядлые пользователи CI Datamapper, которые могли бы помочь, пожалуйста, дайте мне знать, как правильно определить отношения.