2012-01-19 1 views
1

У меня есть приложение, которое требует:Многие к одному и многие ко многим на тех же объектах, использующих DataMapper ОРМ в Codeigniter

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

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

поэтому у меня есть 3 стола, пользователи, проекты_услуги, проекты. Отношения являются:

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

многие пользователи (ID) ---- через projects_users (user_id, project_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?

+0

правый - я вижу, мои «другие» поля не являются взаимными. Результат слишком долго смотрел на код. – Stevo

ответ

1

Посмотрите на множественных отношениях к тем же моделям на странице дока: 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(); 

ОБНОВЛЕНИЕ

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

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

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

+0

Что вы предлагаете, это один к одному и много-ко-многим. Я хочу одного-ко-многим и многих-ко-многим. – Stevo

+0

Я отредактировал это (не уверен, было ли это до вашего комментария). Вот объяснение: «Проект имеет одного владельца». «В проекте много пользователей». «У пользователя есть много принадлежащих проектов». «У пользователя много проектов». - Итак, есть проект от 1 до многих по собственнику ->. В проекте пользователя -> есть много - много. – swatkins

+0

Привет, я должен был сначала прокомментировать. На первый взгляд, мои и твои не кажутся слишком разными. Я хорошо посмотрю. Спасибо за указатель. – Stevo