假设我正在构建一个拥有许多博客和众多用户的引擎。用户可以拥有许多博客,博客可以拥有多个用户(用户拥有AndBelongsToMany博客)。我将创建一个名为users_blogs的数据透视表,它看起来像这样:
id user_id blog_id role
1 1 1 admin
2 1 2 poster
3 2 2 admin
因此,用户1属于博客1和2,用户2属于博客2.用户1是博客1中的管理员,博客2中有海报,用户2是博客2中的管理员。
还会有帖子。 users_blogs将有很多帖子,帖子可以有很多users_blogs。它们将与一个如下所示的数据透视表连接:
id users_blog_id post_id
1 2 1
2 3 1
因此,参考users_blogs,博客2上的用户1与博客2上的用户2合作创建了帖子1。
我对MVC比较陌生,所以我想知道A)第一个表中的“角色”数据是否应该是它的位置?和B)是否有更正确的方法来构建这个结构?框架将为我带来魔力,我只是想确保这是有道理的,并且我有正确的命名约定。我正在使用Cakephp,但我也认为这个问题可以由Rails程序员来回答。
谢谢!
答案 0 :(得分:2)
看起来你走在正确的轨道上。如果我理解你,那应该是这样的:
我没有完全理解你的一个陈述,所以我假设post
belongsTo
一个blog
最像。
第一个问题是,您的“数据透视表”命名约定必须按字母顺序排列 - 因此它应该是blogs_users
,而不是users_blogs
。似乎很小,但不会起作用。
<强>协会
blog hasMany post
post belongsTo blog
user hasAndBelongsToMany blog //allowing more than one user to be associated to a blog
blog hasAndBelongsToMany user
user hasAndBelongsToMany post //allowing more than one user to be associated to a post
post hasAndBelongsToMany user
role hasAndBelongsToMany user //better to keep roles in a table that just a string
user hasAndBelongsToMany role //use 'with'=>'blogs_users' in your association
between user/roll
<强>表格
users (id, name, ...etc)
blogs (id, title, ...etc)
roles (id, role)
blogs_users (id, user_id, role_id, blog_id)
posts (id, title, blog_id)
posts_users (id, post_id, user_id)
<强>更新
我不是最好的 - 仍然有点学习自己,但是 - 从我的头脑中,你可以通过类似这样的东西获得用户1创建的博客1的帖子:
$blogId = '1';
$userId = '1';
$posts = $this->Post->find('all', array(
'conditions' => array(
'User.id' => $userId,
'Blog.id' => $blogId
)
);
答案 1 :(得分:0)
这不是一个rails,cakephp或mvc问题,但是您的关系数据库架构看起来应该基于您所描述的内容。
答案 2 :(得分:0)
我不知道Cakephp,但是你加入表有三个问题会破坏Rails中的habtm关系。
1)默认情况下,连接表名为blogs_users
。
2)连接表不能包含任何其他属性,例如role
。
3)联接表不能有id
。
因此,您的blogs_users
表格应该只有blog_id
和user_id
,否则您将收到错误消息。
如果您希望您的联接表成为Rails中的完整模型,您将需要使用has_many :through
关系。所以
class User
has_many :user_blogs
has_many :blogs, :through => :user_blogs
end
class UserBlog
belongs_to :blog
belongs_to :user
validates_presence_of :role, :in => ALLOWED_ROLE_NAMES # Example of logic in this model
end
class Blog
has_many :user_blogs
has_many :users, :through => :user_blogs
end