symfony - mysql到Criteria()

时间:2011-02-04 13:25:38

标签: symfony1 propel

我在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()查询吗?

由于

1 个答案:

答案 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();

纯粹关系查询的提示是:

  • SELECT部分​​樱桃选择主表的一些列
  • SELECT部分​​聚合来自多个表的数据
  • 所选列使用特定于供应商的SQL函数
  • 查询通过不共享外键的列连接表
  • 查询很长并且会进行多次连接
  • 查询使用GROUP BY或HAVING
  • 用户发布查询,但不知道相应的对象模型

这是“我怎么写......”这个问题最常见的答案。使用ORM在项目内部进行直接数据库查询并不是一件坏事,因为它是工作的正确工具。如果Propel使代码编写起来更复杂,不可重复使用,或者速度慢,那就不要使用它。务实。