2011-02-04 7 views
0

私は、MySQLに次き:のsymfony - 基準にmysqlの()

SELECT t.tag, COUNT(*) AS `count` 
FROM tag t, content_item_tag c 
WHERE t.id = c.tag_id 
GROUP BY t.id, c.tag_id 
ORDER BY count DESC 
LIMIT 0 , 30 

誰かが私はPropelでの基準()クエリにこれを変えるのを助けることはできますか?

おかげ

+0

Propel Criteriaではなくカスタムクエリを使用するべきだと思います。例:http://stereointeractive.com/blog/2007/06/12/propel-queries-using-custom-sql-peer-classes-and-criterion-objects/ – Aston

+0

Propel 1.5以下で必要ですか? – Jan

答えて

4

はPropelののブログの最新エントリーを参照してください:How Can I Write This Query Using An ORM?次はそこからの引用です:

回答#1:あなたはORMを必要としない

に関する最近のポストメーリングリスト推進、ユーザーは次のクエリのPropelのバージョンを尋ね:

SELECT COUNT(t1.user) AS users, t1.choice AS lft, t2.choice AS rgt 
FROM Choices t1 iNNER JOIN Choices t2 ON (t1.user = t2.user) 
WHERE t1.choice IN (...) AND t2.choice IN (...) 
GROUP BY t1.choice, t2.choice; 

をこのクエリは、それは純粋なオブジェクト指向ですされていませんリレーショナルなので、オブジェクト・リレーショナル・マッピングは必要ありません。 ORMの内部でこのクエリを実行するための最良の方法は、直接PDOをORMをスキップして使用することです:純粋なリレーショナル問合せの

<?php 
$con = Propel::getConnection(); 
$query = 'SELECT COUNT(t1.user) AS users, t1.choice AS lft, t2.choice AS rgt 
    FROM choice t1 iNNER JOIN choice t2 ON (t1.user = t2.user) 
    WHERE t1.choice IN (?, ?) AND t2.choice IN (?, ?) 
    GROUP BY t1.choice, t2.choice'; 
$stmt = $con->prepare($query); 
$stmt->bindValue(1, 'foo'); 
$stmt->bindValue(2, 'bar'); 
$stmt->bindValue(3, 'baz'); 
$stmt->bindValue(4, 'foz'); 
$res = $stmt->execute(); 

ヒントは以下のとおりです。

  • SELECT部品チェリーピック一部の列のメインテーブル
  • 複数のテーブルから選択した部分集合体データ
  • 選択された列は、クエリはドン」列を介してテーブルを結合
  • ベンダー固有のSQL関数を使用tは
  • 外部キーを共有するクエリーが長く、いくつかのクエリがGROUP BYを使用していますか
  • ユーザー投稿クエリを有するが、対応するオブジェクトモデル

のないアイデアを持っていない

  • 参加しますそれは「どうすれば書くか」という質問に対する最も一般的な答えです。 ORMを使ってプロジェクト内で直接データベースクエリを使うのは悪いことではない。 Propelが、コードを書いたり、再利用したり、痛いほど遅くしたりするような複雑なものにするなら、それを使用しないでください。実用的であること。

  • +0

    このケースでは、あなたが提供したヒント(5と6)には同意しませんが、ORMをスキップすることが最良のアイデアだと思います。 – Jan

    関連する問題