对这个复杂的 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()