也许我只是在缓慢的一天,但对于我的生活,我无法弄清楚为什么会这样。我有一段时间没有完成CakePHP,我试图使用1.3版本,但这似乎没有用......
我有两种模式:
<?php
class Area extends AppModel {
var $name = 'Area';
var $useTable = 'OR_AREA';
var $primaryKey = 'A_ID';
var $belongsTo = array(
'Building' => array(
'className' => 'Building',
'foreignKey' => 'FK_B_ID',
),
'Facility' => array(
'className' => 'Facility',
'foreignKey' => 'FK_F_ID',
),
'System' => array(
'className' => 'System',
'foreignKey' => 'FK_S_ID',
)
);
}
?>
<?php
class Building extends AppModel {
var $name = 'Building';
var $useTable = 'OR_BLDG';
var $primaryKey = 'B_ID';
var $hasMany = array(
'Area' => array(
'className' => 'Area',
'foreignKey' => 'FK_B_ID',
)
);
}
?>
OR_AREA
有一个标题为FK_B_ID
的列,引用B_ID
。
如果我运行的话:
$this->Building->find('all', array('recursive' => 2));
我为所有建筑物提供了空[Area]
数组,即使OR_AREA
表中有大量与建筑物相关的区域。不仅如此,查询表甚至没有显示CakePHP试图找到除OR_BLDG
中的所有记录之外的任何内容。更令人费解的是,如果我这样做:
$this->Area->find('all');
我获取所有区域,并在适当时填充[Building]
数组。
我错过了什么?
我的架构的相关部分:
CREATE TABLE ORDB_ADMIN.OR_AREA
(
A_ID NUMBER(8),
NAME VARCHAR2(255 BYTE) NOT NULL,
FK_F_ID NUMBER(8),
FK_S_ID NUMBER(8),
FK_B_ID NUMBER(8)
)
CREATE TABLE ORDB_ADMIN.OR_BLDG
(
B_ID NUMBER(8),
BLDG VARCHAR2(90 BYTE) NOT NULL
)
我觉得值得一提的是我正在使用 Oracle ,我发现a ticket似乎描述了我发生的事情,但它在18个月前关闭了,并没有真正的提供了有关问题/纠正措施的详细信息。
我还在1.2 CakePHP Book的“hasMany”部分找到了一条评论:
如果hasMany关联未返回任何记录,请检查主键和foreignKey的列类型是否相同。如果一个是int而另一个是char,则不会从关联中获取任何记录(并且没有警告)。
但是,正如您在上面看到的那样,关键列的两端都是NUMBER(这也是CakePHP希望它们用于Oracle的那些)
答案 0 :(得分:1)
终于找到了为什么会这样。虽然我在Oracle CakePHP中定义了我的列全部大写,但是当你将自定义列定义为大写时,它们会将它们置于小写状态,并且无法找到它们。因此,将所有$ primaryKey和foreignKey定义更改为小写修复了我的问题。
我在找到原因之前就这个问题开了一个ticket,但我不确定除了在书中做笔记以便有人不浪费几天之外还有很多工作要做。这再次:)
答案 1 :(得分:0)
我不确定,这是否正确但是你有什么看起来像我错误的foreignKeys区域模型......就是这样吗?
答案 2 :(得分:0)
在我看来,在蛋糕1.3中belogsTo协会有问题。我认为如果你将外键更改为area_id
和building_id
,一切都会好的。看看this帖子。另一个人遇到了类似的问题,这个解决方案对他有用。
答案 3 :(得分:0)
处理自定义外键时似乎存在一些问题。我和你的问题有类似的问题。起初我尝试使用动态绑定函数,它们大部分时间都在工作。
然而,最近我回去并将所有内容更改为xxx_id(cakephp使用underbars做了很多奇怪的事情,所以xxxx不应该包含任何underbars)并且所有关系才刚刚开始正常工作。
因此,我建议制作所有外键xxxx_id,看看是否能解决问题。