如何为我的CakePHP模型关联使用不同的id字段?

时间:2010-04-06 02:06:28

标签: php cakephp associations

我有一对多的关联,其中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'作为它的状态关联。

我怎样才能做到最好?

4 个答案:

答案 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)。