我有两张桌子: internet_access_codes 和 radacct 。
internet_access_codes 包含多条 radacct 记录。
加入是internet_access_codes.code = radacct.username AND internet_access_codes.fk_ship_id = radacct.fk_ship_id
我创建了2个模型,并希望分别使用$hasMany
和$belongsTo
,以便在获取相关的 radacct 记录时拉 internet_access_codes 记录。
这是代码:
class InternetAccessCode extends AppModel{
var $name = 'InternetAccessCode';
var $hasMany = array(
'Radacct' => array(
'className' => 'Radacct',
'foreignKey'=> false,
'conditions'=> array(
'InternetAccessCode.code = Radacct.username',
'InternetAccessCode.fk_ship_id = Radacct.fk_ship_id'
),
)
);
}
class Radacct extends AppModel{
var $name = 'Radacct';
var $useTable = 'radacct';
var $belongsTo = array(
'InternetAccessCode' => array(
'className' => 'InternetAccessCode',
'foreignKey' => false,
'conditions'=> array(
'InternetAccessCode.code = Radacct.username',
'InternetAccessCode.fk_ship_id = Radacct.fk_ship_id'
)
),
);
}
当我find()
来自 internet_access_codes 的记录时,我希望它也能为我提供所有相关的 radacct 记录。但是我收到了一个错误,因为它没有进行连接。
这是结果和错误:
Array
(
[InternetAccessCode] => Array
(
[id] => 1
[code] => 1344444440
[bandwidth_allowed] => 20000
[time_allowed] => 30000
[expires_at] => 31536000
[cost_price] => 0.00
[sell_price] => 0.00
[enabled] => 1
[deleted] => 0
[deleted_date] =>
[fk_ship_id] => 1
[downloaded_at] => 2011-09-10 22:18:14
)
[Radacct] => Array
(
)
)
错误:警告(512):SQL错误:1054:未知列 'where子句'中的'InternetAccessCode.code' [CORE / cake / libs / model / datasources / dbo_source.php,第684行]
查询:SELECT
Radacct
。id
,Radacct
。fk_ship_id
,Radacct
。radacctid
,Radacct
。acctsessionid
,Radacct
。acctuniqueid
,Radacct
。username
,Radacct
。groupname
,Radacct
。realm
,Radacct
。nasipaddress
,Radacct
。nasportid
,Radacct
。nasporttype
,Radacct
。acctstarttime
,Radacct
。acctstoptime
,Radacct
。acctsessiontime
,Radacct
。acctauthentic
,Radacct
。connectinfo_start
,Radacct
。connectinfo_stop
,Radacct
。acctinputoctets
,Radacct
。acctoutputoctets
,Radacct
。calledstationid
,Radacct
。callingstationid
,Radacct
。acctterminatecause
,Radacct
。servicetype
,Radacct
。framedprotocol
,Radacct
。framedipaddress
,Radacct
。acctstartdelay
,Radacct
。acctstopdelay
,Radacct
。xascendsessionsvrkey
FROMradacct
ASRadacct
WHEREInternetAccessCode
。code
=Radacct
。username
和InternetAccessCode
。fk_ship_id
=Radacct
。fk_ship_id
和Radacct
。deleted
<> 1
在app_model中我还添加了可包含的行为以防万一,但没有区别。
答案 0 :(得分:3)
可悲的是,对于外键= false和条件的关联,cakephp不能很好地工作。关联中的条件应该是Model.field = 1或任何其他常量。
有许多关联首先找到所有当前模型结果,然后它找到所有其他模型结果,其中当前模型结果为foreignKey ...意味着它执行2次查询。如果您设置条件,它会尝试执行此操作,但由于它没有进行连接,您的查询将找不到另一个表的列。
解决方案
使用连接而不是包含或关联来强制连接,您可以找到更多here
如何使用join
的示例$options['joins'] = array(
array(
'table' => 'channels',
'alias' => 'Channel',
'type' => 'LEFT',
'conditions' => array(
'Channel.id = Item.channel_id',
)
));
$this->Model->find('all', $options);
可能的解决方案#2
BelongsTo执行自动连接(并不总是),你可以从radaact做一个发现,这个解决方案的坏处是,它将列出所有radacct并将其internetAccesCode取消,而不是internetAccesCode和所有radaact关联.. ..加入解决方案会给你类似的东西......
你需要做一个很好的foreach来组织你的结果:S虽然不会很难....
希望这能解决你的问题。