Как я могу использовать другое поле идентификатора для одной из моих ассоциаций моделей CakePHP? - PullRequest
1 голос
/ 06 апреля 2010

У меня есть связь один ко многим, в которой у Вещи может быть много Состояний, определенных ниже:

Модель состояния:

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 использовал другой идентификатор для подключения к Status. Например. Thing будет использовать 'id' для всех своих других ассоциаций, но использовать 'thing_status_id' для своей ассоциации Status.

Как мне лучше всего это сделать?

Ответы [ 4 ]

6 голосов
/ 06 апреля 2010

'foreignKey' => false и 'conditions' => 'Thing.status_id = Status.thing_id' для опций ассоциации могут понять, о чем вы спрашиваете. Но я согласен, что с помощью таблицы перевода для отношения habtm.

2 голосов
/ 06 апреля 2010

Таблица состояния, которую я не контролирую, так как получает данные из другого источника (который использует собственные идентификаторы Thing).

Может быть, лучше ввести "таблицу перевода" и сделать из нее связь 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
0 голосов
/ 06 апреля 2010

В конце концов, я смог заставить его работать только с помощью finderQuery с подзапросом SQL.

Вот моя модель:

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, запрос больше не будет работать должным образом, даже если эта строка ничего не делает (мне все еще нужен LIMIT 0,10 в моем SQL).

0 голосов
/ 06 апреля 2010

Вы можете определить foreignkey как хотите. Поэтому я думаю, что вы можете просто изменить 'foreignKey' => 'thing_id', на 'foreignKey' => 'thing_status_id', и изменить столбец thing_id в таблице Statuses.

...