Связанные модели, использующие неправильный первичный ключ - PullRequest
0 голосов
/ 07 октября 2011

У меня есть модель AccountLicense, когда я по какой-то причине выполняю метод getExpiringLicenes, поскольку у меня есть ассоциация с родительской моделью (AccountUser), первичный ключ AccountUser не используется, вместо этого он использует первичный ключ по умолчанию «id». , Я не уверен, почему это происходит. Это все часть плагина.

Любая помощь в этом с благодарностью.

Это исключение, которое я получаю:

Предупреждение (512): ошибка SQL: 1054: неизвестный столбец «AccountUser.id» в «предложении» [CORE / cake / libs / model / datasources / dbo_source.php, строка 684]

Это запрос, который выполняется:

SELECT `AccountLicense`.`license_id`, `AccountLicense`.`user_id`,  
 `AccountLicense`.`board_id`, `AccountLicense`.`license_number`, 
 `AccountLicense`.`license_state`, `AccountLicense`.`license_designation_id`, 
 `AccountLicense`.`active_date`, `AccountLicense`.`expire_date`,
 `AccountLicense`.`is_active`, `AccountLicense`.`is_confirmed`,
 `AccountLicense`.`is_primary`, `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` 
FROM `account_licenses` AS `AccountLicense` 
LEFT JOIN `account_users` AS `AccountUser` 
ON (`AccountLicense`.`user_id` = `AccountUser`.`id`) 
WHERE `AccountLicense`.`expire_date` BETWEEN '2011-10-05' and '2011-11-04'

Это моя модель AccountLicenses:

<?php
class AccountLicense extends AppModel {
    var $name = 'AccountLicense';
    var $primaryKey = 'license_id';
    var $plugin = 'AccountModule';

    var $belongsTo = array(
        'AccountUser' => array(
            'className' => 'AccountUser',
            'foreignKey' => 'user_id'
        )
    );


    public function getExpiringLicenses($date = null)
    {
        if(is_null($date))
            $date = date('Y-m-d',strtotime("+30 days"));
        return $this->find(
            'all',
            array(
                'conditions' => array(
                     $this->name . '.expire_date BETWEEN ? and ?' =>array(date('Y-m-d'),$date)
                 )
            )
        );      
    }
}
?>

Это моя модель AccountUser:

<?php
class AccountUser extends AppModel {
var $name = 'AccountUser';
var $primaryKey = 'user_id';
var $actsAs = array('Containable');

var $validate = array(
    'user_name'=>array(
        'rule'=>'isUnique',
        'message'=>'This username has already been taken. Please try again'
),
    'user_pass' => array(
        'rule' => array('between', 8, 16),
        'message' => 'Passwords must be between 8 and 16 characters long.')

);

var $hasMany = array(
    'AccountLicense' => array(
        'className' => 'AccountLicense',
        'foreignKey' => 'user_id'
    )
);
?>

1 Ответ

1 голос
/ 07 октября 2011

Поскольку это плагин, ваша ассоциация должна иметь имя плагина

Пример: Если ваш плагин называется AccountModule, ваша ассоциация должна выглядеть как

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

Также это не так, но правильный способ объявить класс модели внутри плагина -

<?php
class AccountLicense extends AccountModuleAppModel {

Если он находится в правильном месте в структуре вашей папки и правильно объявлен, вам не понадобится эта строка

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