Ассоциации, не использующие внешний ключ - PullRequest
0 голосов
/ 09 октября 2011

У меня есть модель (AccountAgentDetail), которая имеет 2 ассоциации. Один из них принадлежит ownTo (AccountUser), а другой - hasOne (AccountProfile). Таблица для AccountAgent имеет только отношение FK к AccountUser. Эта модель и связанные с ней модели являются частью плагина.

Проблема, с которой я сталкиваюсь, заключается в том, что при выполнении запроса соединение между AccountProfile и AccountAgentDetail использует неправильную связь. Он использует поле id таблицы AccountAgentDetail вместо поля fk, которое я определил в модели AccountAgentDetail.

Это модель, с которой я работаю:

<?php
class AccountAgentDetail extends AccountModuleAppModel {
var $name = 'AccountAgentDetail';
var $primaryKey = 'agent_detail_id';

var $belongsTo = array(
    'AccountUser' => array(
        'className' => 'AccountModule.AccountUser',
        'foreignKey' => 'user_id',
        'conditions' => '',
        'fields' => '',
        'order' => ''
    )
);

var $hasOne = array(
    'AccountProfile' => array(
        'className' => 'AccountModule.AccountProfile',
        'foreignKey' => 'user_id',
        'conditions' => '',
        'fields' => '',
        'order' => ''
    )   
);

public function getProspectiveAgents($count = 10)
{   
    return $this->find('all',
                 array(
                      'conditions'=>array('AccountAgentDetail.is_prospect'=>1),
                      'order'=>array('AccountAgentDetail.created_date DESC')
                 )
            );
    }
}
?>

Это запрос, который выполняется, когда я вызываю метод getProspectiveAgents. Проблема, которую я вижу во втором левом соединении, использует AccountAgentDetail. agent_detail_id вместо AccountAgentDetail. user_id

SELECT
`AccountAgentDetail`.`agent_detail_id`,
`AccountAgentDetail`.`user_id`,
`AccountAgentDetail`.`is_prospect`,
`AccountAgentDetail`.`mls_id`,
`AccountAgentDetail`.`primary_office`,
`AccountAgentDetail`.`primary_board`,
`AccountAgentDetail`.`commission_plan`,
`AccountAgentDetail`.`referred_by`,
`AccountAgentDetail`.`referral_source`,
`AccountAgentDetail`.`previous_brokerage`,
`AccountAgentDetail`.`created_date`,
`AccountAgentDetail`.`last_modify_date`,
`AccountAgentDetail`.`created_by`,
`AccountAgentDetail`.`last_modifed_by`,
`AccountUser`.`user_id`,
`AccountUser`.`user_name`,
`AccountUser`.`user_pass`,
`AccountUser`.`user_status`,
`AccountUser`.`user_group`,
`AccountUser`.`instance_id`,
`AccountUser`.`is_logged_in`,
`AccountUser`.`is_visible`,
`AccountUser`.`created_by`,
`AccountUser`.`last_modified_by`,
`AccountUser`.`created_date`,
`AccountUser`.`last_modified_date`,
`AccountProfile`.`profile_id`,
`AccountProfile`.`user_id`,
`AccountProfile`.`first_name`,
`AccountProfile`.`middle_name`,
`AccountProfile`.`last_name`,
`AccountProfile`.`birth_date`,
`AccountProfile`.`ssn`,
`AccountProfile`.`employee_id`,
`AccountProfile`.`hire_date`,
`AccountProfile`.`sever_date`,
`AccountProfile`.`rehire_date`,
`AccountProfile`.`created_by`,
`AccountProfile`.`last_modified_by`,
`AccountProfile`.`created_date`,
`AccountProfile`.`last_modify_date`
FROM
`account_agent_details` AS `AccountAgentDetail`
LEFT JOIN `account_users` AS `AccountUser` ON(
`AccountAgentDetail`.`user_id` = `AccountUser`.`user_id`
)
LEFT JOIN `account_profiles` AS `AccountProfile` ON(
`AccountProfile`.`user_id` = `AccountAgentDetail`.`agent_detail_id`
)
WHERE
`AccountAgentDetail`.`is_prospect` = 1
ORDER BY
`AccountAgentDetail`.`created_date` DESC

1 Ответ

0 голосов
/ 10 октября 2011

Вы удалили "agent_detail_id" в качестве первичного ключа, мне кажется логичным выбрать его в качестве первичного ключа для объединения вместо user_id, который является внешним ключом! Хотя я не знаю точно, как этот класс работает в фоновом режиме, я думаю, вам стоит поработать с вашей моделью.

На вашем месте я бы работал в своем уме вне контекста модели класса mvc, думая только под E-Relational "рамкой".

Не уверен насчет этого ... может быть, ваши бизнес-требования таковы, что вы можете совместно использовать первичный ключ user_id, фактически говоря, что он является и внешним ключом, и первичным ключом в AccountAgentDetail, если он один-на-один.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...