我几乎得到了蛋糕来做我想要的但不完全的,我认为这是因为我的知识存在差距。
我已将英国邮政编码的数据库表导入我的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错误?
答案 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',
);
}
这应该可行