Я пытаюсь использовать 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(), но я бы хотел, чтобы сдерживаемое поведение работало так, как будто оно должно было работать, и сокращать ненужные дополнительные запросы к базе данных.
Спасибо за ссылку! Я не знал, что существует обычное поведение. Я проверю его позже, полезно ли это? – metrobalderas 2010-12-10 16:36:39
Предположительно. Он выполняет полнотекстовые поиски и настраивается в том, как он индексирует ваши данные, но у меня, очевидно, возникает эта проблема, чтобы вернуть связанные данные модели. – 2010-12-10 17:02:02