对这个复杂的 SQL 使用 cakephp 的 find 方法

Posted

技术标签:

【中文标题】对这个复杂的 SQL 使用 cakephp 的 find 方法【英文标题】:using cakephp's find method for this complex SQL 【发布时间】:2012-04-21 17:31:35 【问题描述】:

我想使用 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 被搜索查询替换。

感谢您提供的任何帮助。

【问题讨论】:

【参考方案1】:

两件事:

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

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

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

【讨论】:

以上是关于对这个复杂的 SQL 使用 cakephp 的 find 方法的主要内容,如果未能解决你的问题,请参考以下文章

使用 cakePHP 对单个字段进行 SQL Sum 不适用于 paginate()

尝试将 sql 查询详细说明到 cakephp 时总是出错;如何转换这个?

对于一个庞大的项目,什么是更好的CakePHP或纯PHP?

CakePHP - 构建一个复杂的查询

这个回调如何对 cakePHP 组件起作用?

如何使用 CakePhp 克隆/复制 sql 记录?