我有这张桌子:
订户
id | name |
---+-------+
1 | Hill |
2 | Sam |
3 | Joe |subscribers_years
subscriber_id | year |
--------------+-------+
1 | 2009 |
1 | 2010 |
1 | 2011 |
2 | 2009 |
2 | 2010 |
3 | 2010 |我想使用最高值为x的记录进行高级搜索。如果x= 2010结果查询必须是: Sam和Joe!
我试试看:
$query = $this->createQuery('su')
->select('su.id, su.name)
->addWhere(
'(SELECT MAX(year) AS maxYear FROM `subscribers_years` WHERE `subscriber_id`=`su.id`) = ?',
2010
);但是我有一个消息错误: Message:未能找到类subscribers_years
我应该如何正确地写我的查询?
解决方案
$query->addWhere('(SELECT MAX(year) AS maxYear FROM SubscriberYear WHERE subscriber_id=su.id) = ?', 2010 );我的错误是我没有使用类名Doctrine作为From,而是使用了表mysql!:S的名称。
发布于 2011-12-19 16:48:08
您不能在原则子查询中使用普通SQL。你有两个选择:
subscribers_years中使用子查询表的模型名如果您不需要任何高级SQL,我将选择选项1,因为它的SQL较少,而且不需要指定联接条件,否则应该使用2。
如果您没有subscribers_years,那么始终可以为它添加一个Doctrine类。
发布于 2012-09-01 07:02:42
我认为最好的方法是使用createSubquery()显式地告诉有关子查询的理论,然后将其嵌套到where条件中。该模式非常简单,可以用于任何复杂性。然后,您的查询应该如下所示:
$query = $this->createQuery('su')
->select('su.id, su.name)
;
$subquery = $query->createSubquery()
->select("MAX(year) AS maxYear")
->from("SubscriberYear")
->where("subscriber_id=su.id")
;
$query->addWhere($subquery->getDql().' = ?', 2010 );下面是另一个创建Subqueries的示例:
http://www.philipphoffmann.de/2012/08/taming-doctrine-subqueries/
https://stackoverflow.com/questions/8563614
复制相似问题