使用finderQuery的CakePHP 2.3模型关联与Model-> read()一起使用,但不与Model-> find()一起使用

时间:2013-03-15 12:19:55

标签: php mysql cakephp model-associations cakephp-2.3

我几乎得到了蛋糕来做我想要的但不完全的,我认为这是因为我的知识存在差距。

我已将英国邮政编码的数据库表导入我的cakePHP应用程序。结构如下:

CREATE TABLE IF NOT EXISTS `postcodes` (
  `ref` varchar(6) NOT NULL DEFAULT '',
  `area` varchar(50) NOT NULL DEFAULT '',
  `uk_region` varchar(4) NOT NULL,
  `lat` decimal(6,4) NOT NULL DEFAULT '0.0000',
  `long` decimal(5,4) NOT NULL DEFAULT '0.0000',
  PRIMARY KEY (`ref`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

以下是CSV格式的该表格中的一行。

"AB10","Aberdeen","SCOT","57.1350","-2.1170"

'帐户'和'订单'需要能够从邮政编码参考'

中查找这些详细信息

因此,在阅读完本文http://www.visuallizard.com/blog/2009/02/19/210之后,我仔细研究了一下(我只是展示了帐户模型):

class Account extends AppModel {
    public $hasOne = array('Postcode' => 
        array(
          'className' => 'Postcode', 
          'finderQuery' => 'SELECT Postcode.* FROM accounts, postcodes AS Postcode WHERE accounts.id = {$__cakeID__$} AND accounts.postcode_ref = Postcode.ref', 'foreignKey' => false
));

}

现在,如果我做其中任何一个' 16'是测试帐户ID:

$this->Account->read(null, 16);
$this->Account->find('first', array('conditions' => array('Account.id' => 16)));

检索数据一切正常。但是,如果我这样做:

$this->Account->find('all', array('conditions' => array('Account.id' => 16)));

我得到的数组结果正确但是2,821次;这是有多少邮政编码条目。

将它从$ hasOne更改为$ hasMany也只返回一次结果,但它在$ result [' Postcode'] [0]中,因为所有有多个查询都是'因为我相信你们中的一些人可能会理解,所以我会继续选择。

关于我在这里做了什么的任何线索?我是否误解了某些内容或者这是一个CakePHP错误?

1 个答案:

答案 0 :(得分:3)

你最好的选择就是“转变”这种关系;帐户所属邮政编码。由于一个帐户只能有一个邮政编码,基本上它“属于”邮政编码,每个邮政编码(区域)可以包含(包含)多个帐户。

您似乎已经在帐户表中为foreignKey字段命名正确,但请务必在邮政编码模型中指定“ref”作为主键。这种关系看起来像这样;

Account extends AppModel {
    public $belongsTo = array(
        // additional settings are probably not
        // required because postcode_ref follows the
        // CakePHP conventions, so foreignKey will
        // automatically be detected
        'Postcode',
    );

}

邮政编码模式:

Postcode extends AppModel {
    // Important because of non-standard PK name
    public $primaryKey = 'ref';


    public $hasMany = array(
        'Account',
    );
}

这应该可行