CakePHP: получение записей на основе поля в связанной модели - PullRequest
1 голос
/ 08 апреля 2011

Я пытаюсь выполнить поиск по полю в связанной модели.Я могу сделать это с помощью модели принадлежит модели, но не модели hasMany.Я уверен, что это что-то простое, я пропускаю, но я не вижу этого.Может ли кто-нибудь указать мне правильное направление (или даже страницу с кулинарной книгой, в которой я нуждаюсь - искал, но не нашел ничего похожего на это).Спасибо

В группах контроллер: (это не работает)

$group = $this->Group->find('all', array('conditions' => array('Voucher.id' => '55')));

Это делает:

$group = $this->Group->find('all', array('conditions' => array('TourOperator.id' => '3')));

Фоновые фрагменты файла:

ГруппаМодель:

var $belongsTo = array(
        'TourOperator' => array(
            'className' => 'TourOperator',
            'foreignKey' => 'tour_operator_id',
            'conditions' => '',
            'fields' => '',
            'order' => ''
        )
    );

    var $hasMany = array(
        'Voucher' => array(
            'className' => 'Voucher',
            'foreignKey' => 'group_id',
            'dependent' => true,
            'conditions' => '',
            'fields' => '',
            'order' => 'Voucher.date, Voucher.meal_type_id'         
        )
    );

Модель ваучера:

var $belongsTo = array(
        'Group' => array(
            'className' => 'Group',
            'foreignKey' => 'group_id',
            'conditions' => '',
            'fields' => '',
            'order' => ''
        )
    );

Модель туроператора:

var $hasMany = array(
    'Group' => array(
        'className' => 'Group',
        'foreignKey' => 'tour_operator_id',
        'dependent' => false,
        'conditions' => '',
        'fields' => '',
        'order' => '',
        'limit' => '',
        'offset' => '',
        'exclusive' => '',
        'finderQuery' => '',
        'counterQuery' => ''
    )
);

Обновление (как указано в комментарии ниже, но более понятно для прочтения здесь)

В итоге я использовал это.

$groups = $this->Group->Voucher->find('all', array('fields' => 'DISTINCT group_id', 'conditions' => array('Voucher.status' => 'pending')));
$group_ids = Set::extract($groups, '/Voucher/group_id');
$data = $this->Group->find('all', array('conditions' => array('Group.id' => $group_ids)));

Я получаю отдельный список идентификаторов групп, соответствующих моим критериям, создаю массив только идентификаторов, а затем использую его для извлечения групптак что массивы упорядочены так, как я ожидаю, на мой взгляд.

Ответы [ 2 ]

0 голосов
/ 08 апреля 2011

Можете ли вы преобразовать свой запрос в $this->Voucher->find, а затем использовать связанные данные группы, полученные из этого запроса? Как вы говорите, нет проблем с поиском групп по их идентификатору TourOperator, и отношение Группы / Ваучер выглядит как обратное.

0 голосов
/ 08 апреля 2011

С контейнерным поведением CakePHP вы не можете использовать условия для связанных данных в ассоциациях hasMany и hasAndBelongsToMany.Это связано с тем, что для получения этих связей используются отдельные запросы.

Однако с помощью поведения Linkable вы можете использовать данные из ассоциаций hasMany для фильтрации записей.Поведение можно скачать здесь: https://github.com/Terr/linkable

Linkable использует стандартные JOIN для объединения данных.Это означает, что он не вытягивает все связанные данные (то есть все ваучеры, связанные с вашей группой (группами)), как обычный SELECT.Тем не менее, он может работать вместе с Containable для выполнения обоих действий.

Примеры README можно найти в качестве примеров работы Linkable.

(отказ от ответственности: в настоящее время я поддерживаю Linkable, но этоне причина, по которой я указываю на это)

...