我正在使用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 Profile
和Profile hasMany Posts
而已经假设。我的另一个问题是定义帖子与其主题之间的关系。
鉴于这些标准,我的协会应如何看待?我在协会上所做的所有研究只展示了简单的例子。
我正在使用CakePHP 2.1.3版
感谢您提前提供任何帮助和/或建议
答案 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中添加的帖子的时间点。