gpt4 book ai didi

php - 如何通过未按约定命名的字段关联 CakePHP 中的模型?

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:52:14 25 4
gpt4 key购买 nike

我有两个表,其中都有字段 username。我如何为本地表和外部表指定字段名称?

我希望 CakePHP 会做类似的事情

ON (`T1`.`username` = `T2`.`username`)`

结果。如果没有任何更改,表将按以下条件连接:

ON (`T1`.`id` = `T2`.`t1_id`)`

设置 'foreign_key' = 'username' 属性是不够的,因为它会产生这样的查询:

ON (`t1`.`id` = `t2`.`username`)`

我有两个解决方案。第一个是使用“join”属性并动态连接表。在这种情况下,我可以同时设置本地和外国字段。但是如果我需要将更多表连接到那个表,手动连接,我不能再使用 contain 我需要手动编写以下连接,即使该关联设置正确。所以我每次都需要编写长连接定义,而不是只使用 'contain' => array('T1', 'T2', 'T3')

其次是将表的'primary_key'设置为相应的字段。它可以在模型文件或运行时完成。在我的例子中,它不能在模型中完成,因为该表还通过其 'id' 字段具有“正确”关联。设置它运行时就是这种情况,但我不喜欢它,因为它不明显而且看起来像 hack。

当我问这个问题时,我以为我遗漏了一些明显的东西,但现在我明白了 CakePHP 无法做到这一点。所以我开始悬赏,希望有人分享解决方案。如果没有,我将尝试阅读蛋糕源代码并重新定义模型的一些方法,以添加在关联定义中的 'foreign_key' 附近定义本地字段的能力。

最佳答案

外键错误

在连接条件中有一个不使用相关模型主键的关联 - 标准方法是使用 'foreignKey' => false

即而这个协会:

class Comment extends AppModel {
public $belongsTo = array(
'Profile' => array(
)
);
}

将生成此 sql:

SELECT ... LEFT JOIN profiles on ON (Profile.id = Comment.profile_id)

指定不能像这样使用外键:

class Comment extends AppModel {
public $belongsTo = array(
'Profile' => array(
'foreignKey' => false
)
);
}

将产生这个(无效的)sql:

SELECT ... LEFT JOIN profiles on ON ()

从这一点开始,可以使用条件数组键指定所需的条件:

class Comment extends AppModel {
public $belongsTo = array(
'Profile' => array(
'foreignKey' => false,
'conditions' => array(
'Comment.username = Profile.username'
),
)
);
}

(注意条件定义为字符串)导致:

 SELECT ... LEFT JOIN profiles on ON (Comment.username = Profile.username)

关于php - 如何通过未按约定命名的字段关联 CakePHP 中的模型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19911052/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com