Как сделать имя отношения независимым от связанной модели в CI Datamapper? - PullRequest
1 голос
/ 03 января 2012

При проектировании отношения в 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, которые могли бы помочь, пожалуйста, дайте мне знать, как правильно определить отношения.

1 Ответ

2 голосов
/ 03 января 2012

ОБНОВЛЕНИЕ

Вы можете сохранить объект как отношение, используя ключ отношения:

$object->save( $related, $relationship_key ). 

Поэтому вам нужно будет использовать

$user->save($role, "roles");

См. Нижнюю часть этой веб-страницы: http://datamapper.wanwizard.eu/pages/save.html


Оставьте этот бит на случай, если он поможет кому-то другому.

Похоже, что выхочу иметь собственное имя в отношениях.(Это то, что я получаю после прохождения всего цинизма) -

Вы можете назвать отношения как угодно с помощью ключа в массиве отношений.Итак, в следующем фрагменте вы используете book <- это имя должно или не должно совпадать с именем класса - вот для чего нужна клавиша <code>class.

class Author extends DataMapper {
  $has_many = array(
    'book' => array(  // YOU USE THIS KEY TO NAME THE RELATIONSHIP
        'class' => 'book',
        'other_field' => 'author',
        'join_self_as' => 'author',
        'join_other_as' => 'book',
        'join_table' => 'authors_books'
     )
  );
}

Еслиэто не работает для вас, я думаю, у вас есть что-то не так в настройке ваших отношений.

http://datamapper.wanwizard.eu/pages/advancedrelations.html

...