【问题标题】:Cake: habtm relationship with not-default key on other modelCake:habtm 与其他模型上的非默认键的关系
【发布时间】:2011-09-22 15:18:49
【问题描述】:

我有 2 个模型需要通过 habtm 关系链接,具有以下表结构:

类别:

id   |   name   | ..
-----------------------
 1   |   test   | ..

帖子:

id   |   name   | other_id | ..
---------------------------------
 1   |   test   | 5        | ..

CATEGORIES_POSTS:

id   |   category_id | other_id
--------------------------------
 1   |   1           |  5

我需要从类别方面获取帖子,但似乎无法正确设置 habtm 关系。到目前为止我没有提到的重要一点是 Post-model 中使用的 id 不是 id 而是 other_id。这是我迄今为止尝试过的(全部在类别模型中):

  • 将 associationForeignKey 设置为 'other_id'

    在 sql-query 中它有:CategoriesPost.other_id = Post.id 片段 -> 错误的关系(应该是 CategoriesPost.other_id = Post.other_id

  • 将associationForeignKey设置为false并添加条件CategoriesPost.other_id = Post.other_id

    现在sql片段是CategoriesPost. = Post.id --> sql错误

  • 将关联外键设置为CategoriesPost.other_id = Post.other_id

    嗯 .. 这也是一个错误,因为 Cake 将输入作为 1 个字段:CategoriesPost.other_id = Post.other_id = Post.id

我知道我可以通过 2 个 hasMany 链接实现关联,但这给了我很多查询而不是 1 个

提前致谢!

【问题讨论】:

  • CATEGORIES_POST 是表的名称吗? Cake 会尝试使用 CATEGORIES_POSTS。否则,associationForeignKey = 'other_id' 的错误信息是什么?
  • 你是对的连接表名称。我在上面更正了它并添加了我的尝试结果..
  • 只是出于好奇,您为什么不遵守 Cake 的约定?也就是说,链接Post.idPost.other_id有什么区别?在我看来,如果他们是 1-1,你可以省去很多麻烦。
  • 另外,您尝试使用哪个模型执行find()?邮政?或类别?为清楚起见尝试 #2,您是否使用数组表示法或字符串表示 condition
  • 对于第一个问题:我遇到问题的数据库结构具有不同的结构。很难解释。每篇文章都会生成几个不同的“出版物”(例如语言)。所以 real 模型是出版物。该模型的内容是通过导出所有可能版本的帖子创建的-> 我有一个 publication_id 和一个 post_id .. 正如我所说:难以解释 --- 第二个问题:错误 .. 我认为是字符串,但不是很一定要诚实

标签: cakephp has-and-belongs-to-many


【解决方案1】:

只需即时更改后期模型 primaryKey 即可进行一些您需要的操作.... 为此,只需在控制器中执行 $this->primaryKey = 'other_id' 或 $this->Post->primaryKey= 'other_id'

这样就可以了。

但是请记住,如果您要从所有关联中检索数据并且您的关联多于这个关联,那么其他关联(如果它们使用 Post.id)将会失败,因为主键是 Post.other_id

当你使用这个联合时,你应该在你的帖子模型中做一个查找功能,像这样:

function otherFind ($type, $options){
    $this->primaryKey = 'other_id';
    $result = $this->find($type, $options);
    $this->primaryKey = 'id';
    return $result;
}

如果您需要将它与其他模型连接起来会有点棘手,我会建议使用连接(尝试查看可链接的行为代码以了解如何)

我强烈建议只使用一个主键,因为第二个主键并没有真正的帮助。无论如何,主键都应该是唯一的,您可以将任何内容与一个关联。

【讨论】:

  • 如此简单但又如此聪明.. 你写的一切都是对的(就像 Jason 和 Ivo)。为了比上面更好地解释这个问题,为什么我需要这个 db-design:我构建了一个 CMS,其中内容以模块化方式创建,每个部分依赖于 4 个变量。动态创建出版物需要很长时间,所以我将它们导出到另一个数据库并对其进行非规范化。因此,从先前的主模型(docs)中创建了几个出版物,这些出版物都是 docs 的子项(如果它会被规范化)。但是,这些类别仍然链接到文档。非常感谢您的(所有)答案!
  • 评论太短了 :) 我重读了上面的内容并再次认为这很难理解.. 可能是我需要提高我的英语“技能”
【解决方案2】:

在进行正常查找时,Cake 无法自定义用于连接的主键。

如果你真的想要,你可以使用自定义连接:http://book.cakephp.org/view/1047/Joining-tables

为什么你需要两个 id?您正在尝试将帖子加入某个类别,无论如何,ID 都是唯一的;就这两者而言,主要应该可以正常工作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-03-13
    • 2014-05-15
    • 2012-05-14
    • 2021-02-27
    • 1970-01-01
    • 2020-06-13
    • 1970-01-01
    • 2016-07-13
    相关资源
    最近更新 更多