Используя метод поиска cakephp для этого сложного SQL

70
5

Я хочу использовать метод поиска CakePHP, чтобы я мог воспользоваться его ассоциациями моделей. Проблема в том, что у меня этот сложный SQL-поиск, и я не знаю, как его перевести в метод поиска CakePHP. Я только что использовал $model- > query(), а затем использовал Set:: extract на идентификаторах. Проблема в том, что я теряю порядок релевантности. Как я могу преобразовать это в метод find в Cake, чтобы я мог использовать ассоциации?


SQL:


SELECT id, title, SUM(relevance) as total_relevance FROM (
SELECT
card_definitions.id,
card_definitions.title,
(MATCH(card_definitions.title) AGAINST ('%s')) * 5 AS relevance
FROM card_definitions
UNION
SELECT
card_definitions.id,
card_definitions.title,
(MATCH(card_def_identities.special_ability_text) AGAINST ('%s')) * 0.5 AS relevance
FROM card_def_identities
INNER JOIN card_definitions ON card_def_identities.card_def_sid = card_definitions.id
UNION
SELECT
card_definitions.id,
card_definitions.title,
(MATCH(brigades.brigade_color) AGAINST ('%s')) AS relevance
FROM brigades
INNER JOIN card_def_brigades ON brigades.id = card_def_brigades.brigade_sid
INNER JOIN card_definitions ON card_def_brigades.card_def_sid = card_definitions.id
UNION
SELECT
card_definitions.id,
card_definitions.title,
(MATCH(identifiers.identifier) AGAINST ('%s')) AS relevance
FROM identifiers
INNER JOIN card_def_identifiers ON identifiers.id = card_def_identifiers.identifier_sid
INNER JOIN card_definitions on card_def_identifiers.card_def_sid = card_definitions.id
UNION
SELECT
card_definitions.id,
card_definitions.title,
(MATCH(card_effects.effect) AGAINST ('%s')) AS relevance
FROM card_effects
INNER JOIN card_def_effects ON card_effects.id = card_def_effects.effect_sid
INNER JOIN card_definitions on card_def_effects.card_def_sid = card_definitions.id
) AS combined_search
GROUP BY id
HAVING total_relevance > 0
ORDER BY total_relevance DESC
LIMIT 10;

%s заменяется поисковым запросом.


Спасибо за любую помощь, которую вы можете предоставить.

спросил(а) 2012-04-21T20:31:00+04:00 8 лет, 6 месяцев назад
1
Решение
99

Две вещи:


Во-первых, CakePHP не поддерживает UNION прямо из... духовки. Если вы захотите воссоздать это способом, не отбрасывая его в query(), вы должны взглянуть на решение Chucks, где он вручную создает подзапросы: Использование хранимых процедур (процедур и функций), но этот процесс еще более тривиально с такими инструментами, как Adminer (администратор .org) или phpMyAdmin.

(Извините за вставку URL-адреса - я был ограничен двумя действительными ссылками!)

ответил(а) 2012-05-17T12:14:00+04:00 8 лет, 5 месяцев назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема