非标准密钥存在可控行为问题?

时间:2011-04-03 13:13:12

标签: cakephp cakephp-1.3

我正在使用遗留数据库,其密钥遵循惯例,但遗憾的是,不是蛋糕惯例,而且我已经碰到了可容纳行为的奇怪之处 - 它正在提取错误的数据。这是我的设置:

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}})之前,这不是问题。任何想法都会非常感激。

1 个答案:

答案 0 :(得分:0)

看起来这直接归因于非标准密钥。看起来,Containable行为似乎是Cake 的其他元素希望遵循约定。此外,一些关键关联在字段名称中包含双下划线(__),并导致其他问题。

孩子们,不要在家里试试。遵循惯例,即使这意味着操纵旧数据库。