1

我有一个应用程序需要:

用户拥有许多项目。项目有一个所有者。

用户从事许多项目。项目有很多用户。

所以我有 3 个表,用户,projects_users,项目。关系是:

一个用户(所有者)---许多项目(created_by)

许多用户(id)----通过projects_users(user_id,project_id)----许多项目(id)。

在 Codeigniter 中,我在数据映射器模型中设置了以下关系:

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 中表示这种关系的正确方法是什么?

4

1 回答 1

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数组中声明的“键”匹配。您不需要更新usersorprojects表(唯一的要求是它们每个都有一个名为“id”的主键字段)

于 2012-01-19T20:53:02.627 回答