Je suis en train d'utiliser CakePHP 1.3.5 de searchable behavior avec le comportement maîtrisable pour retourner des résultats de recherche pour un modèle spécifié et un modèle associé (article belongsTo utilisateur).Obtenir des résultats de comportement interrogeables CakePHP pour contenir des associations plus profondes
Ignorer le comportement des recherches pour un moment, l'appel suivant à find():
$this->Article->find('all', array(
'conditions' => array('Article.is_published' => 1),
'fields' => array('Article.id'),
'contain' => array('User.name')
));
exécute cette requête 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
et retourne le tableau suivant:
Array (
[0] => Array (
[Article] => Array (
[id] => 10
)
[User] => Array (
[name] => Author Name
[id] => 7
)
)
...
)
Ce qui est exactement ce qui est attendu. Cependant, l'appel suivant à recherche():
$this->Article->search($query, array(
'conditions' => array('Article.is_published' => 1),
'fields' => array('Article.id'),
'contain' => array('Article' => array('User.name'))
));
Exécute cette requête 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
et retourne ce tableau:
Array (
[0] => Array (
[Article] => Array (
[id] => 9
)
)
...
)
Regarder la recherche() méthode, il renvoie $this->SearchIndex->find('all', $findOptions);
. $ FINDOPTIONS contient les éléments suivants:
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
)
)
)
L'association ne pas se perdre en chemin, car à l'intérieur SearchableBehavior, $this->SearchIndex->Article->belongsTo['User']
est présent et intact immédiatement avant et après l'appel à trouver() dans la recherche() méthode.
L'appel à la recherche() retourne exactement la même chose pour toutes les valeurs suivantes de « contenir »:
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'))))
Ai-je fait quelque chose de mal? Je pense que j'utilise le même format que celui indiqué dans the CakePHP documentation, et je n'ai rien trouvé en ligne qui suggère que vous deviez faire quelque chose de spécial pour obtenir des résultats de recherche avec des données associées.
Je sais que je pourrais facilement atteindre le résultat que je souhaite en recherchant simplement les utilisateurs avec des appels supplémentaires à find(), mais je voudrais obtenir un comportement confinable pour fonctionner comme il est censé et réduire inutilement requêtes de base de données supplémentaires.
Merci pour le lien! Je ne savais pas qu'il existait un comportement de recherche. Je vais le vérifier plus tard, est-ce utile? – metrobalderas
Soi-disant. Il fait des recherches fulltext et est personnalisable dans la façon dont il indexe vos données, mais je suis évidemment avoir ce problème pour obtenir des données de modèle associées. –