2

我正在使用 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 Profileand Profile hasMany Posts。我的另一个问题是定义帖子与其主题之间的关系。

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

鉴于这些标准,我的关联应该如何看待?我对关联所做的所有研究都只展示了简单的例子。

我正在使用 CakePHP 2.1.3 版

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

4

2 回答 2

2

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

在模型中(我建议把它放在 AppModel 中,因为我发现自己对所有东西都使用了 Containable):

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

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

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

如果您将该数据设置为您的视图,则您可以访问其中一篇文章的 id $user['Profile']['Post'][0]['id']

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

public $hasMany = array(
    'Topic' => array(
        'className' => 'Topic',
        'conditions' => 'Post.topic_id IS NOT NULL'
    )
)
于 2012-06-21T22:04:08.397 回答
2

我认为一切看起来都很好

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

主题有很多帖子,你就完成了。您描述的主题/帖子条件可以通过表格和保存在模型上之前进行控制。例如,“帖子必须与个人资料相关联”,在您根据登录用户的会话信息保存您添加到 profile_id 中的帖子时。

于 2012-06-21T23:00:29.007 回答