2011-02-04 40 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 

有人可以幫我這個轉換爲行走一個Criteria()查詢?

感謝

+0

我認爲你應該使用自定義查詢,而不是Propel Criteria。例如:http://stereointeractive.com/blog/2007/06/12/propel-queries-using-custom-sql-peer-classes-and-criterion-objects/ – Aston 2011-02-04 15:57:19

+0

您是否需要Propel 1.5或更低? – Jan 2011-02-04 17:11:07

回答

4

查看行走的博客最新的條目:How Can I Write This Query Using An ORM?以下是從那裏報價:

答1:你不需要一個ORM

在最近的文章中propel-users郵件列表詢問以下查詢的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這裏面查詢,最好的辦法是跳過ORM並直接使用PDO:一個純粹的關係查詢

<?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部分​​櫻桃挑選的一些列主表
  • 的SELECT從多個表部分聚集數據
  • 所選列使用供應商特定的SQL函數
  • 該查詢通過列聯接表,唐」牛逼共享一個外鍵
  • 查詢是漫長的,使得若干個連接
  • 查詢使用GROUP BY和HAVING
  • 用戶帖子的查詢,但沒有相應的對象模型的想法

這是「我該怎麼寫...」問題最常見的答案。當使用ORM進行項目的正確工具時,使用ORM求助於項目內的直接數據庫查詢並不是一件壞事。如果Propel使得代碼寫得更復雜,不可重用或痛苦緩慢,那麼就不要使用它。務實。