Многие к одному и Многие ко многим на одних и тех же объектах, используя datamapper ORM в Codeigniter - PullRequest
1 голос
/ 20 января 2012

У меня есть приложение, которое требует:

Пользователь владеет многими проектами. у проекта есть один владелец.

Пользователь работает над многими проектами. проекты имеют много пользователей.

так у меня есть 3 таблицы, пользователи, projects_users, проекты. Отношения:

один пользователь (владелец) --- много проектов (создал_бай)

много пользователей (id) ---- через projects_users (user_id, project_id) ---- много проектов (id).

В Codeigniter я установил следующие отношения в моделях Datamapper:

Class Project extends DataMapper {

var $has_one = array(
    'created_by' => array(
        'class' => 'user',
        'other_field' => 'owns'
    )
);
var $has_many = array('user' => array(
        'class' => 'user',
        'other_field' => 'project',
        'join_table' => 'projects_users'));

и ...

    class User extends DataMapper {

var $has_many = array(
    'project' => array(
        'class' => 'project',
        'other_field' => 'user',
        'join_table' => 'projects_users'
    ),
    'owns' => array(
        'class' => 'project',
        'other_field' => 'created_by'
    )
);

Это, похоже, не работает, и я получаю рекурсивную ошибку. Как правильно представить это отношение в datamapper?

1 Ответ

1 голос
/ 20 января 2012

Взгляните на Несколько связей с одной и той же моделью на странице документа: http://datamapper.wanwizard.eu/pages/advancedrelations.html

Я предполагаю, что-то вроде этого:

class Project extends DataMapper {
    $has_one = array(
        'owner' => array(
            'class' => 'user',
            'other_field' => 'owned_project'
        )
    );
    $has_many = array(
        'user' => array(
            'class' => 'user',
            'other_field' => 'user_project'
        )
    );
}

class User extends DataMapper {
    $has_many = array(
        'owned_project' => array(
            'class' => 'project',
            'other_field' => 'owner'
        ),
        'user_project' => array(
            'class' => 'project',
            'other_field' => 'user'
        )
    );
}

и вы получите доступ к этому:

$project = new Project(1); // where "1" is the ID of the project
$owner = $project->owner->get();
$project_users = $project->user->get();

// -------------------------------

$me = new User(1); // where "1" is the ID of the user
$my_projects = $me->owned_project->get();

UPDATE

Вам нужно обновить таблицу projects_users присоединения к этому:

projects_users
--------------
user_id
owner_id
owned_project_id
user_project_id

Обратите внимание, что все они соответствуют "ключам", которые вы объявили в своих массивах $has_one и $has_many. Вам не нужно обновлять таблицы users или projects (единственное требование - чтобы у каждой из них было поле первичного ключа с именем "id") .

...