使用cakephp';s查找此复杂SQL的方法

使用cakephp';s查找此复杂SQL的方法,sql,cakephp,orm,model,Sql,Cakephp,Orm,Model,我想使用CakePHP的find方法,这样就可以利用它的模型关联。问题是我有这个复杂的SQL搜索,我不知道如何将它转换成CakePHP的find方法。我刚刚在ID上使用了$model->query(),然后使用了Set::extract。问题是我失去了关联顺序。如何将其转换为Cake中的find方法,以便使用关联 SQL: SELECT id, title, SUM(relevance) as total_relevance FROM ( SELECT card_def

我想使用CakePHP的find方法,这样就可以利用它的模型关联。问题是我有这个复杂的SQL搜索,我不知道如何将它转换成CakePHP的find方法。我刚刚在ID上使用了$model->query(),然后使用了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
被搜索查询替换

感谢您提供的帮助。

两件事:

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

其次,在开始将此查询硬塞进蛋糕中之前,您可能会发现,在数据库中使用存储过程是一种很好的情况,因为看起来此查询在没有修改的情况下重复使用(这只是一个搜索吗?)。一旦创建了过程,就可以在模型中创建一个直接调用它的方法。以下是MySQL文档必须说明的内容:但使用Adminer(Adminer.org)或phpMyAdmin等工具,这个过程甚至更简单

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

两件事:

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

其次,在开始将此查询硬塞进蛋糕中之前,您可能会发现,在数据库中使用存储过程是一种很好的情况,因为看起来此查询在没有修改的情况下重复使用(这只是一个搜索吗?)。一旦创建了过程,就可以在模型中创建一个直接调用它的方法。以下是MySQL文档必须说明的内容:但使用Adminer(Adminer.org)或phpMyAdmin等工具,这个过程甚至更简单

(很抱歉粘贴URL-我被限制为两个实际链接!)