cakephp поисковый плагин cakedc - поиск по нескольким таблицам / нескольким запросам - PullRequest
0 голосов
/ 24 октября 2011

У меня проблемы с поиском по нескольким таблицам. У меня есть настройка поиска по ключевым словам на модели карточек, которая работает нормально, я также хочу, чтобы ключевые слова смотрели на модель контакта, которая имеет внешний ключ card_id. Кажется, я не могу понять, как это сделать.

Точки, на которые следует обратить внимание при возникновении проблем, - это функция findByContacts и:

array('Contact.street_suburb' => 'contacts', 
      'type' => 'subquery', 
      'method' => 'findByContacts', 
      'field' => 'Card.id'),

Первоначально я пытался просто найти пригород для поиска, но в идеале я хотел бы, чтобы любое поле в модели контактов отображалось при поиске карты.

Спасибо!

Мой код в карточной модели выглядит следующим образом:

public $filterArgs = array(
    array('name' => 'keyword', 'type' => 'query', 'method' => 'filterQuery'),
);

public $hasAndBelongsToMany = array('Contact' => array('with' => 'Contact'));

public function filterQuery($data = array()) {
    if(empty($data['keyword'])) { // keyword is the name of my search field
        return array();
    }

    $query = '%'.$data['keyword'].'%';
    return array(
        'OR' => array(
            array('Card.name LIKE' => $query),
            array('Property.name LIKE' => $query),
            array('Building.name LIKE' => $query),
            array('Stage.name LIKE' => $query),
            array('Contact.street_suburb' => 'contacts', 'type' => 'subquery', 'method' => 'findByContacts', 'field' => 'Card.id'),
        )
    );
} // END SEARCH 

// FIND BY CONACTS - PART OF SEARCH
// ------------------------------------------------------------------------------------>
public function findByContacts($data = array()) {
        $this->Contact->Behaviors->attach('Containable', array('autoFields' => false));
        $this->Contact->Behaviors->attach('Search.Searchable');
        $query = $this->Contact->getQuery('all', array(
            'conditions' => array('Contact.street_suburb'  => $data['contacts']),
            'fields' => array('foreign_key'),
            'contain' => array('Contact')
        ));
        return $query;
    }

1 Ответ

0 голосов
/ 01 февраля 2014

У меня была похожая проблема. Оказывается, мне пришлось вручную определять «с» в модели HABTM, хотя я (думал), что все мои поля соответствовали стандартному соглашению CakePHP. Кроме того, я не вижу, чтобы вы вызывали findByContacts в ваших filterArgs, но, возможно, я пропускаю это.

Итак, мой код работал так:

(Модель сокровищ, соответствующий код)

public $filterArgs = array(array('name' => 'makers', 'type' => 'subquery', 'method' => 'findByMaker', 'field' => 'Treasure.id'),);

public function findByMaker($data = array()) {
$this->MakersTreasure->Behaviors->attach('Containable', array('autoFields' => false));
$this->MakersTreasure->Behaviors->attach('Search.Searchable');
    $query = $this->MakersTreasure->getQuery('all', array(
        'conditions' => array("Maker.name LIKE '%" . $data['makers'] ."%'"),
        'fields' => array('treasure_id'),
        'contain' => array('Maker'),
    //the limit does not work, but it does make the timeout query halt so you can see what's going on
    //'limit'=>1
    ));
    return $query;
}

И затем, также на модели, которую я должен был установить для Makers как таковой:

public $hasAndBelongsToMany = array(
    'Maker' => array(
        'className' => 'Maker',
        'joinTable' => 'makers_treasures',
        'foreignKey' => 'treasure_id',
        'associationForeignKey' => 'maker_id',
        'unique' => 'keepExisting',
        'with' => 'MakersTreasure'
    ),
            ...

Так что в вашей функции не похоже, что вы ссылаетесь на модель соединения при выполнении запроса или в вашем «with». У вас есть таблица соединений в вашей базе данных для HABTM? Судя по всему, если у Contact есть FK card_id, то это не отношения HABTM, а OnetoMany или что-то еще.

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