我有一个需要的应用程序:
用户拥有许多项目。 项目有一个所有者。
用户可以处理许多项目。 项目有很多用户。
所以我有3个表,用户,projects_users,项目。 关系是:
一个用户(所有者)---许多项目(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'
)
);
这似乎不起作用,我得到一个递归错误。 在datamapper中表示这种关系的正确方法是什么?
答案 0 :(得分: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”的主键字段)。