CakePHP $ hasMany не извлекает данные из модели $ ownTo. Регистрация не создана - PullRequest
0 голосов
/ 21 сентября 2011

У меня есть две таблицы: internet_access_codes и radacct . internet_access_codes имеет множество radacct записей.Объединение internet_access_codes.code = radacct.username AND internet_access_codes.fk_ship_id = radacct.fk_ship_id

Я создал 2 модели и хотел использовать $hasMany и $belongsTo соответственно, чтобы связанные записи radacct были получены при получении и internet_access_codes запись.

Вот код:

class InternetAccessCode extends AppModel{
var $name = 'InternetAccessCode';
var $hasMany = array(
    'Radacct' => array(
        'className' => 'Radacct',
        'foreignKey'=> false,
        'conditions'=> array(
            'InternetAccessCode.code = Radacct.username',
            'InternetAccessCode.fk_ship_id = Radacct.fk_ship_id'
        ),
    )
);

}

class Radacct extends AppModel{
var $name = 'Radacct';
var $useTable = 'radacct';

var $belongsTo = array(
    'InternetAccessCode' => array(
        'className' => 'InternetAccessCode',
        'foreignKey' => false,
        'conditions'=> array(
            'InternetAccessCode.code = Radacct.username',
            'InternetAccessCode.fk_ship_id = Radacct.fk_ship_id'
        )
    ),
);

}

Когда я find() запись из internet_access_codes Я ожидаю, что это даст мне все соответствующие radacct записи также.Однако я получил ошибку, потому что он не сделал объединение.

Вот результат и ошибка:

Array
(
    [InternetAccessCode] => Array
        (
            [id] => 1
            [code] => 1344444440
            [bandwidth_allowed] => 20000
            [time_allowed] => 30000
            [expires_at] => 31536000
            [cost_price] => 0.00
            [sell_price] => 0.00
            [enabled] => 1
            [deleted] => 0
            [deleted_date] => 
            [fk_ship_id] => 1
            [downloaded_at] => 2011-09-10 22:18:14
        )

    [Radacct] => Array
        (
        )

)

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

Запрос: SELECT Radacct. id, Radacct. fk_ship_id, Radacct. radacctid, Radacct. acctsessionid, Radacct. acctuniqueid, Radacct. username, Radacct. groupname, Radacct. realm, Radacct. nasipaddress, Radacct. nasportid, Radacct. nasporttype, Radacct. acctstarttime, Radacct. acctstoptime, Radacct. acctsessiontime, Radacct. acctauthentic, Radacct. connectinfo_start, Radacct. connectinfo_stop, Radacct. acctinputoctets, Radacct. acctoutputoctets, Radacct. calledstationid, Radacct. callingstationid, Radacct. acctterminatecause, Radacct. servicetype, Radacct. framedprotocol, Radacct. framedipaddress, Radacct. acctstartdelay, Radacct. acctstopdelay, Radacct. xascendsessionsvrkey ОТ radacct КАК Radacct ГДЕ InternetAccessCode. code = Radacct. username И InternetAccessCode. fk_ship_id = Radacct. fk_ship_id И Radacct. deleted <> 1

В app_model я также добавил поведение на всякий случай, но оно не имело никакого значения.

1 Ответ

3 голосов
/ 21 сентября 2011

К сожалению, cakephp не слишком хорошо работает с ассоциациями с внешним ключом = false и условиями.Ожидается, что условия в ассоциациях будут такими, как Model.field = 1 или любая другая константа.

Ассоциация имеет множество связей сначала находит все результаты текущей модели, затем она находит все другие результаты модели, которые имеют результаты текущей модели foreignKey ... то есть она выполняет 2 запроса.Если вы поставите условия, он все равно попытается это сделать, но поскольку соединение не было выполнено, ваш запрос не найдет столбец другой таблицы.

Решение

использует объединения вместо содержимогоили объединение для принудительного объединения вы можете найти больше здесь

пример использования объединения

$options['joins'] = array(
    array(
        'table' => 'channels',
        'alias' => 'Channel',
        'type' => 'LEFT',
        'conditions' => array(
            'Channel.id = Item.channel_id',
        )
    ));
$this->Model->find('all', $options);

Возможное решение # 2

BelongsToвыполнять автоматическое объединение (не всегда), и вы могли бы сделать вывод из radaact, что плохо в этом решении, заключается в том, что он будет перечислять все radacct и помещать свой связанный с InternetAccesCode вместо internetAccesCode и всех связанных с radaact .... ОбъединениеРешение даст вам что-то похожее, хотя ...

Вам нужно будет сделать хороший foreach, который организует ваши результаты: S, хотя это не будет трудно, хотя ....

Надеюсь, эторешает вашу проблему.

...