我正在使用遗留数据库,其密钥遵循惯例,但遗憾的是,不是蛋糕惯例,而且我已经碰到了可容纳行为的奇怪之处 - 它正在提取错误的数据。这是我的设置:
TechnologyIncentive belongsTo...
array(
'Incentive' => array(
'className' => 'Incentive',
'type' => 'inner',
'foreignKey' => false, # actually 'incentive_id', but we need to fool Cake
'conditions' => array( 'TechnologyIncentive.incentive_id = Incentive.incentive_id' ),
),
'Technology' => array(
'className' => 'Technology',
'type' => 'inner',
'foreignKey' => false, # actually 'incentive_tech_id', but we need to fool Cake
'conditions' => array( 'TechnologyIncentive.incentive_tech_id = Technology.incentive_tech_id' )
),
);
你可以看到我必须通过将foreignKey
设置为false并在where子句中定义链接来欺骗Cake使用我的非标准键。到目前为止一切都很好。
现在,当我尝试从TechnologyIncentive
模型运行查询时:
$this->find( 'all', array(
'contain' => array( 'Incentive', 'Technology' ),
'fields' => array( 'Incentive.name', 'Technology.name', 'TechnologyIncentive.amount' ),
'conditions' => array( /** conditions... */ )
);
一切都很好。东西很好地包含,我得到了我所期望的。然后我需要添加TechnologyGroup
hasMany Technology
,其中contain
因某些原因而崩溃。
现在我的'contain' => array( 'Incentive', 'Technology' => array( 'TechnologyGroup' ) )
选项如下所示:
Incentive
我得到的是fields
记录包含激励记录。这并不奇怪,因为我在一个地方指定了几个字段(主contain
选项)并隐含了$result['Incentive']['incentive_id']
选项中的所有字段,但真的奇怪的是什么我是他们不同的激励措施。 “包含”的激励是错误的。
检查SQL,看起来查询是在没有有效的where子句的情况下运行的,因此所有内容都被拉动,然后人为地限制为单个记录。请注意$result['Incentive']['Incentive']['incentive_id']
和Array
(
[Incentive] => Array
(
[incentive_id] => MD046
[name] => Incentive name
[category] =>
[Incentive] => Array
(
[incentive_id] => AK004
[code] => AK04F
[version] => 2
[category] => Incentive Category
)
)
)
之间的差异。
TechnologyGroup
有没有人碰到过这个?在我想要检索扩展记录({{1}})之前,这不是问题。任何想法都会非常感激。
答案 0 :(得分:0)
看起来这直接归因于非标准密钥。看起来,Containable行为似乎是Cake 的其他元素希望遵循约定。此外,一些关键关联在字段名称中包含双下划线(__),并导致其他问题。
孩子们,不要在家里试试。遵循惯例,即使这意味着操纵旧数据库。