Cake:与其他模型上的not-default键的habtm关系

时间:2011-09-22 15:18:49

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

我有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模型中使用的id 不是 id而是other_id。这是我到目前为止所尝试的(所有在类别模型中):

  • 将associationForeignKey设置为'other_id'

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

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

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

  • 将associationForeignKey设置为CategoriesPost.other_id = Post.other_id

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

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

提前致谢!

2 个答案:

答案 0 :(得分:1)

在执行常规查找时,Cake无法自定义要在连接上使用的主键。

如果您真的需要,可以使用自定义加入:http://book.cakephp.org/view/1047/Joining-tables

为什么你需要两个ID?您正尝试将帖子加入某个类别,无论如何,ID都是唯一的;至于将两者联系起来,小学应该可以正常工作。

答案 1 :(得分:1)

只需动态更改帖子模型primaryKey即可进行某些操作.... 要做到这一点,只需要在控制器$ this-> Post-> primaryKey ='other_id'

中执行$ this-> primaryKey ='other_id'OR

那就可以了。

但请记住,如果您从所有关联中检索数据并且您拥有的关联数多于此关联,则其他关联如果使用Post.id将失败,因为主键是Post.other_id

你应该在你的帖子模型中做一个find函数,当你使用这个联合时,就像这样:

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

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

我强烈建议只使用一个主键,因为它不是第二个主键。无论如何,主键应该是唯一的,您只需将其与一个键相关联。