2

我想使用 CakePHP 的 find 方法,这样我就可以利用它的模型关联。问题是我有这个复杂的 SQL 搜索,但我不知道如何将它翻译成 CakePHP 的 find 方法。我一直在使用 $model->query() 然后在 ID 上使用 Set::extract 。问题是我失去了相关顺序。如何将其转换为 Cake 中的 find 方法以便我可以使用关联?

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替换为搜索查询。

感谢您的任何帮助,您可以提供。

4

1 回答 1

0

两件事情:

首先,CakePHP 不支持 UNION 直接出炉。如果您想以一种蛋糕的方式重新创建它而不只是将其转储到 query() 中,您应该查看 Chucks 解决方案,他手动创建子查询:CakePHP 中的 UNION 语法。虽然这是为 Cake 1.2 编写的,但它应该为您指明正确的方向。当前关于子查询的文档可以在这里找到:book.cakephp.org/2.0/en/models/retrieving-your-data.html#sub-queries

其次,在开始执行将这个查询硬塞到 Cake 中的任务之前,因为看起来这个查询在没有修改的情况下被重复使用(它只是一个搜索,对吗?)你可能会发现这是在数据库中使用存储过程的好情况. 创建过程后,您可以在模型中创建一个直接调用它的方法。以下是 MySQL 文档必须说的:使用存储的例程(过程和函数),但使用像 Adminer (adminer.org) 或 phpMyAdmin 这样的工具,这个过程就更简单了。

(很抱歉粘贴了 URL - 我仅限于两个实际链接!)

于 2012-05-17T09:14:55.420 回答