2010-12-09 3 views
2

Я пытаюсь использовать CakePHP 1.3.5's searchable behavior с сдерживающим поведением, чтобы возвращать результаты поиска по указанной модели и ассоциированной модели (изделие принадлежит пользователю).Получение результатов поиска CakePHP для более глубоких ассоциаций

Игнорирования для поиска поведения на минуту, следующий вызов находки():

$this->Article->find('all', array(
    'conditions' => array('Article.is_published' => 1), 
    'fields' => array('Article.id'), 
    'contain' => array('User.name') 
)); 

Выполнение этого SQL-запрос:

SELECT `Article`.`id`, `User`.`name`, `User`.`id` FROM `articles` AS `Article` LEFT JOIN `users` AS `User` ON (`Article`.`user_id` = `User`.`id`) WHERE `Article`.`is_published` = 1 

И возвращает следующий массив:

Array (
    [0] => Array (
     [Article] => Array (
      [id] => 10 
     ) 
     [User] => Array (
      [name] => Author Name 
      [id] => 7 
     ) 
    ) 
    ... 
) 

Это именно то, что ожидается. Однако, следующий вызов поиска():

$this->Article->search($query, array(
    'conditions' => array('Article.is_published' => 1), 
    'fields' => array('Article.id'), 
    'contain' => array('Article' => array('User.name')) 
)); 

Выполнение этого SQL-запрос:

SELECT `Article`.`id` FROM `search_index` AS `SearchIndex` LEFT JOIN `articles` AS `Article` ON (`SearchIndex`.`model` = 'Article' AND `SearchIndex`.`association_key` = `Article`.`id`) WHERE `Article`.`is_published` = 1 AND MATCH(`SearchIndex`.`data`) AGAINST('search term' IN BOOLEAN MODE) AND `Article`.`id` IS NOT NULL 

И возвращает этот массив:

Array (
    [0] => Array (
     [Article] => Array (
      [id] => 9 
     ) 
    ) 
    ... 
) 

Глядя на поиск(), возвращается $this->SearchIndex->find('all', $findOptions);. $ findOptions содержит следующее:

Array (
    [conditions] => Array (
     [Article.is_published] => 1 
     [0] => MATCH(SearchIndex.data) AGAINST('search term' IN BOOLEAN MODE) 
    ) 
    [fields] => Array (
     [0] => Article.id 
    ) 
    [contain] => Array (
     [Article] => Array (
      [0] => User.name 
     ) 
    ) 
) 

Ассоциация не заблудиться по пути, потому что внутри SearchableBehavior, $this->SearchIndex->Article->belongsTo['User'] присутствует и неповрежденной непосредственно до и после того, как вызов, чтобы найти() внутри поиска() метод.

Вызов поиска() возвращает одно и то же для всех следующих значений «содержит»:

array('Article' => array('User.name')) 

array('Article' => array('User')) 

array('Article' => array('User' => array())) 

array('Article' => array('User' => array('fields' => array('User.name')))) 

array('Article' => array('User' => array('fields' => array('name')))) 

Я делаю что-то не так? Я думаю, что я использую тот же формат, что и в the CakePHP documentation, и я ничего не нашел в Интернете, что предполагает, что вам нужно сделать что-то особенное, чтобы получить результаты поиска со связанными данными.

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

+0

Спасибо за ссылку! Я не знал, что существует обычное поведение. Я проверю его позже, полезно ли это? – metrobalderas 2010-12-10 16:36:39

+0

Предположительно. Он выполняет полнотекстовые поиски и настраивается в том, как он индексирует ваши данные, но у меня, очевидно, возникает эта проблема, чтобы вернуть связанные данные модели. – 2010-12-10 17:02:02

ответ

1

При использовании Containable установите рекурсивный вариант «истинный»

$this->Model->Behaviors->attach("Containable",array("recursive"=>true)); 
Смежные вопросы