如何建立这种关联?

时间:2012-06-21 20:31:06

标签: php cakephp associations

我正在使用cakephp框架来开发一个应用程序,而且我很难完全理解这些模型之间的关联。您可以在下面看到四个模型及其相关数据库字段。

User
 id

Profile
 id
 user_id

Post (A blog post on the users profile)
 id
 profile_id
 topic_id

Topic (A topic for a blog post)
 id
 name

以下是目前的协会:

User
 hasOne: Profile

Profile
 hasMany: Posts

Post
 belongsTo: Topic, Profile

现在我的问题。我不确定您是否必须定义User hasMany Posts之类的关联,或者是否因为User hasOne ProfileProfile hasMany Posts而已经假设。我的另一个问题是定义帖子与其主题之间的关系。

  • 个人资料可以有无限的帖子
  • 帖子必须与个人资料相关联
  • 帖子只能有一个主题
  • 主题表包含所有主题的列表
  • 帖子不需要主题

鉴于这些标准,我的协会应如何看待?我在协会上所做的所有研究只展示了简单的例子。

我正在使用CakePHP 2.1.3版

感谢您提前提供任何帮助和/或建议

2 个答案:

答案 0 :(得分:2)

您可以递归地查找关联关联,甚至更好地使用Containable。

在模型中(我建议将它放在AppModel中,因为我发现自己使用Containable用于所有内容):

class AppModel extends Model {
    public $actsAs = array('Containable');
    ...
}

然后,当您为用户调用read(或查找或分页)时,很可能在控制器中执行此操作:

$this->User->contain(array(
    'Profile' => array(
        'Post'
    )
));
$data = $this->User->read();
$set('user',$data);

如果您将该数据设置为视图,则可以访问$user['Profile']['Post'][0]['id']中其中一个帖子的ID。

现在针对您的下一个问题,您可以拥有条件关联。

public $hasMany = array(
    'Topic' => array(
        'className' => 'Topic',
        'conditions' => 'Post.topic_id IS NOT NULL'
    )
)

答案 1 :(得分:2)

我觉得一切都很好

您的假设是正确的,您无需定义用户/帖子关系。用户没有很多帖子,个人资料呢。你可以将user_id存储在Post而不是profile_id上​​,以使事情更直观,但这取决于你。

主题hasMany Post,你完成了。您描述的主题/帖子条件可以通过表单控制,然后保存在模型上。例如,“帖子必须与个人资料相关联”,以及根据登录用户的会话信息保存您在profile_id中添加的帖子的时间点。