1

以下を必要とするアプリケーションがあります。

ユーザーは多くのプロジェクトを所有しています。プロジェクトの所有者は 1 人です。

ユーザーは多くのプロジェクトに取り組んでいます。プロジェクトには多くのユーザーがいます。

したがって、users、projects_users、projects の 3 つのテーブルがあります。関係は次のとおりです。

1 人のユーザー (所有者) --- 多くのプロジェクト (created_by)

多くのユーザー (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'
    )
);

ただし、これは機能していないようで、再帰エラーが発生します。この関係をデータマッパーで表現する正しい方法は何ですか?

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配列で宣言した「キー」と一致することに注意してください。またはテーブルを更新する必要はありません(唯一の要件は、それぞれに「id」という名前の主キー フィールドがあることです)usersprojects

于 2012-01-19T20:53:02.627 に答える