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

2つのこと:

第一に、CakePHP は UNION をすぐに使えるようにはサポートしていません。これを query() にダンプするだけでなく簡単な方法で再作成したい場合は、サブクエリを手動で作成する Chucks ソリューションを見てください: CakePHP の UNION 構文。これは Cake 1.2 用に書かれたものですが、正しい方向を示しているはずです。サブクエリに関する現在のドキュメントは、book.cakephp.org/2.0/en/models/retriving-your-data.html#sub-queries にあります。

第 2 に、このクエリを Cake に押し込むミッションに着手する前に、このクエリは変更せずに繰り返し使用されているように見えるため (単なる検索ですよね?)、これはデータベースでストアド プロシージャを使用するのに適した状況であることに気付くかもしれません。 . プロシージャを作成したら、それを直接呼び出すモデル内のメソッドを作成できます。MySQL のドキュメントには次のように書かれています: Using Stored Routines (Procedures and Functions)

(URL の貼り付けについて申し訳ありません-実際のリンクは 2 つに制限されていました!)

于 2012-05-17T09:14:55.420 に答える