我有一对多的关联,其中Thing可以定义如下定义的许多状态:
状态模型:
class Status extends AppModel
{
var $name = 'Status';
var $belongsTo = array(
'Thing' => array(
'className' => 'Thing',
'foreignKey' => 'thing_id',
);
}
事物模型:
class Thing extends AppModel
{
var $name = 'Thing';
var $belongsTo = array(
// other associations
);
var $hasMany = array(
'Status' => array(
'className' => 'Status',
'foreignKey' => 'thing_id',
'dependent' => false,
'order' => 'datetime DESC',
'limit' => '10',
),
// other associations
);
}
这可行,但我希望Thing使用不同的ID连接到Status。例如。对于它的所有其他关联,使用'id'但是使用'thing_status_id'作为它的状态关联。
我怎样才能做到最好?
答案 0 :(得分:6)
'foreignKey' => false
和'conditions' => 'Thing.status_id = Status.thing_id'
可以找出您的要求。
但我同意将翻译表用于habtm关系。
答案 1 :(得分:2)
状态表我没有太多控制权,因为它从另一个来源获取数据(使用自己的Thing id)。
也许最好引入一个“翻译表”并从中建立HABTM关系。它还用一些并非绝对必要的数据来抵消你的Thing表的“污染”。
things
id
...
HABTM Status
with => ThingAltId
thing_alt_ids
id
thing_id
status_thing_id
...possibly other ids used to identify Thing in 3rd party systems...
statuses
id
thing_id
HABTM Thing
with => ThingAltId
答案 2 :(得分:0)
您可以根据需要定义foreignkey
。我认为您可以将'foreignKey' => 'thing_id',
更改为'foreignKey' => 'thing_status_id',
并更改{{1}表中的列thing_id
}}
答案 3 :(得分:0)
最后,我只能通过使用带有SQL子查询的finderQuery来使其工作。
这是我的模特:
class Thing extends AppModel
{
// ...
var $hasMany = array(
'Status' => array(
'className' => 'Status',
'foreignKey' => 'thing_id',
'dependent' => false,
'limit' => 10,
'finderQuery' => '
SELECT Status.*
FROM statuses AS Status
WHERE Status.thing_id = (
SELECT Thing.status_thing_id
FROM things AS Thing
WHERE Thing.id = {$__cakeID__$}
)
ORDER BY Status.datetime DESC
LIMIT 0, 10',
),
),
// ...
}
真的很奇怪的是,如果我删除'limit'=> 10行查询不再正常工作,即使该行没有做任何事情(我仍然需要我的SQL中的LIMIT 0,10)。