我在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中的Criteria()查询吗?
由于
答案 0 :(得分:4)
请参阅Propel博客上的最新条目: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();
纯粹关系查询的提示是:
这是“我怎么写......”这个问题最常见的答案。使用ORM在项目内部进行直接数据库查询并不是一件坏事,因为它是工作的正确工具。如果Propel使代码编写起来更复杂,不可重复使用,或者速度慢,那就不要使用它。务实。