С CakePHP, Как выбрать записи на основе условий в связанных таблицах - PullRequest
1 голос
/ 21 марта 2011

Еще один вопрос noob - используя v1.2.1.8004 CakePHP, я думаю ...

У меня есть 3 таблицы: broker (B), quote_site (QS) и broker_quote_site (BQS), которые связывают их вместе.

B имеет много BQS (принадлежит B) QS имеет много BQS (это относится к QS)

Я пытаюсь получить сайты котировок, которые связаны с конкретным брокером, но CakePHP не выполняет присоединения к таблицам за кулисами.

Вот мой запрос:

    $quote_sites = $this->QuoteSite->find('all', array(
        'conditions' => array(
            'Broker.company_id' => $company_id,
            'BrokerQuoteSite.is_active' => true
        ),
        'contain' => array(
            'BrokerQuoteSite' => array(
                'Broker'
            )
        )
    ));

Вот соответствующие модели:

<?php
class QuoteSite extends AppModel
{
    var $name = 'QuoteSite';
    //$validate set in __construct for multi-language support
    //The Associations below have been created with all possible keys, those that are not needed can be removed
    var $hasMany = array(
        'BrokerQuoteSite' => array(
            'className' => 'BrokerQuoteSite',
            'foreignKey' => 'quote_site_id',
            'dependent' => false,
            'conditions' => '',
            'fields' => '',
            'order' => '',
            'limit' => '',
            'offset' => '',
            'exclusive' => '',
            'finderQuery' => '',
            'counterQuery' => ''
        )
    );
}
?>

Брокер:

<?php
class Broker extends AppModel
{
    var $name = 'Broker';
    //$validate set in __construct for multi-language support
    //The Associations below have been created with all possible keys, those that are not needed can be removed
    var $hasMany = array(
        'BrokerQuoteSite' => array(
            'className' => 'BrokerQuoteSite',
            'foreignKey' => 'broker_id',
            'dependent' => false,
            'conditions' => '',
            'fields' => '',
            'order' => '',
            'limit' => '',
            'offset' => '',
            'exclusive' => '',
            'finderQuery' => '',
            'counterQuery' => ''
        )
    );
}
?>

И последний:

<?php
class BrokerQuoteSite extends AppModel
{
    var $name = 'BrokerQuoteSite';
    //$validate set in __construct for multi-language support
    //The Associations below have been created with all possible keys, those that are not needed can be removed
    var $belongsTo = array(
        'Broker' => array(
            'className' => 'Broker',
            'foreignKey' => 'broker_id',
            'conditions' => '',
            'fields' => '',
            'order' => '',
        ) ,
        'QuoteSite' => array(
            'className' => 'QuoteSite',
            'foreignKey' => 'quote_site_id',
            'conditions' => '',
            'fields' => '',
            'order' => '',
        )
    );
}
?>

Заранее благодарим за любые советы / хитрости.

Ответы [ 2 ]

2 голосов
/ 21 марта 2011

Крис, почему вы не определили Брокера как отношение HABTM, тогда простой поиск получит желаемые результаты?

class Broker extends AppModel {
    var $name = 'Broker';   
    var $hasAndBelongsToMany = array(
        'QuoteSite' =>
            array(
                'className'              => 'QuoteSite',
                'joinTable'              => 'broker_quote_sites',
                'foreignKey'             => 'broker_id',
                'associationForeignKey'  => 'quote_site_id'                    
            )
    );
}

http://book.cakephp.org/view/1044/hasAndBelongsToMany-HABTM

0 голосов
/ 21 марта 2011

Хороший вопрос, и я подумал сделать это за два шага

$this->Broke = ClassRegistry::init("Broke");
$brokeids = $this->Broke->find("list",array("conditions"=>array('Broker.company_id' => $company_id)));     //get all B ids

$this->QuoteSite->Behaviors->attach('Containable');  //use containable behavior
$quote_sites = $this->QuoteSite->find('all',array(
                                                     'contain'=>array(
                                           'BrokerQuoteSite'=>array(
              'conditions'=>array(
                                  "BrokerQuoteSite.broke_id"=>$brokeids,
                                  "BrokerQuoteSite.is_active" => true
                                 )
                                                                   )
                                                                      )

                                                  )

                                      );     

Код еще не проверен, возможно, есть некоторые синтаксические ошибки. Надеюсь, это поможет.

update

$this->Broke = ClassRegistry::init("Broke");
$this->Broke->recursive=2;
$brokes = $this->Broke->find("all",array("conditions"=>array("Broke.company_id"=>$comany_id)));

необходимая информация о QS должна быть найдена, если вы просматриваете результат с помощью debug($brokes);. Что вам нужно сделать, это извлечь их измассив.

Ура.

...