Получение результатов поиска в CakePHP для поиска более глубоких ассоциаций - PullRequest
2 голосов
/ 10 декабря 2010

Я пытаюсь использовать CakePHP 1.3.5 с возможностью поиска с включаемым поведением, чтобы возвращать результаты поиска для указанной модели и связанной модели (Article ProperTo User).

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

$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
        )
    )
    ...
)

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

$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
        )
    )
    ...
)

Глядя на метод search (), он возвращает $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'] присутствует и не затрагивается непосредственно до и после вызоваfind () внутри метода search ().

Вызов search () возвращает точно такую ​​же вещь для всех следующих значений параметра "contains" :

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'))))

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

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

1 Ответ

1 голос
/ 10 декабря 2010

При использованииableable установите рекурсивную опцию на «true»

$this->Model->Behaviors->attach("Containable",array("recursive"=>true));
...