CakePHP多对多关系附加数据

时间:2009-07-29 22:16:05

标签: cakephp many-to-many model-view-controller

我是CakePHP的新手,我正在编写一个CakePHP应用程序,它目前有一个Author模型和一个Book模型。作者和书籍都有多对多的关系 但是,我想另外,对于每个作者 - 书籍关系,都有一个与该作者博客相对应的链接,在那里他们反映了他们写这本书的经历。

如果这令人困惑,以下段落试图详细说明我的情况更清楚:

对于每位作者,都会有一篇关于他们每本书经历的文章。反过来看这种关系,这意味着对于每本书,每位作者都会有一个相应的链接(鉴于书籍可以有多位作者),其中作者描述了他/她编写书籍的经历。

换句话说,对于每一个(作者,书籍)对,我希望能够存储相关的URL。

更加花哨,抽象的数学术语,我将使用可怕和不正确:我有一个无向图,每个顶点是一个作者或一本书,每个边都有一个顶点的作者和另一个顶点的书。这听起来有点令人困惑,但(我认为)它正如我所能完全描述我的情况 鉴于上面的描述,我想知道我是否可以将任意数据附加到该关系的任何给定边缘,并在以后检索它。

目前我有第三个模型,AuthorBook,它起到图形边缘的作用 作者与AuthorBook有一个hasMany关系 Book与AuthorBook有很多关系 AuthorBook与Author和Book有一个belongsTo关系,另外还有一个url字段。

此解决方案有效,但出于某种原因,Book与Author没有直接关联这一事实困扰着我。有没有办法实现同样的效果,同时还将AuthorBook模型从图片中删除?

(另外,我意识到我可以在保留AuthorBook的同时将它们直接关联起来,但这看起来很丑陋且多余。)

(另外,我意识到我仍然会有一个author_book SQL表。这丝毫不会让我烦恼,我认为不管怎么说都不可能。)

感谢您的时间!请不要点燃我!

1 个答案:

答案 0 :(得分:6)

是的,你可以为AuthorBook关系建模(或你设想的'边缘')。

class Author extends AppModel {
    ...
    $hasAndBelongsToMany = array('Book', array('with' => 'AuthorBook'));
    ....
}

with”habtm选项:

  

定义连接表的模型名称。默认情况下,CakePHP将为您自动创建模型。使用上面的示例,它将被称为RecipesTag。通过使用此键,您可以覆盖此默认名称。连接表模型可以像任何“常规”模型一样直接访问连接表。

这相当于RoR的“through”,在this illustration中很好地描述了