我在使用Doctrine制作一个相当简单的查询时遇到了麻烦......
我有两个数组($ countries,$ cities),我需要检查数据库记录值是否与任何内部匹配.我正在寻找类似的东西:
->whereIn('country', 'city', $countries, $cities)
Run Code Online (Sandbox Code Playgroud)
......"国家"是美元国家的地方,"城市"是美元城市的地方.
我可以把两者分开,但是所需的查询有很多其他条件,所以这是不可能的.我之后得到的SQL将是:
SELECT ...
WHERE ...
AND ...
AND ...
AND ('country' IN (1,2,3) OR 'city' IN (7,8,9))
AND ...
AND ...;
Run Code Online (Sandbox Code Playgroud)
因此,人们可以认为它也只是一个包围问题.有人知道Doctrine DQL是否可以实现这一点?我查看了文档,但找不到任何方向.
谢谢
在Doctrine手册中,尽可能在Constrain关系下,它给出了"消除非必要关联"和"尽可能避免双向关联"的建议.我不明白什么标准会使协会"必不可少".
我之所以这么说,是因为看起来你经常想要从一对多关系的一方而不是多方方面.例如,我想获取所有用户的活动PhoneNumbers,而不是获取所有活动的PhoneNumbers及其关联的用户.当您必须遍历多个一对多关系时,这变得更加重要,例如,如果您希望在过去两天内看到所有具有MissedCall的用户(MissedCall-> PhoneNumber-> User).
这是简单情况下反向关联的外观:
SELECT * FROM User u
LEFT JOIN u.PhoneNumbers p WITH p.active
Run Code Online (Sandbox Code Playgroud)
如果有一种方法可以在DQL中以相反的方向跨越给定关系,那将会更加明智,如下面的原始SQL:
SELECT * FROM User u
LEFT JOIN PhoneNumber p ON p.User_id = u.id AND p.active
Run Code Online (Sandbox Code Playgroud)
有人可以解释为什么他们提出这个建议,在什么情况下值得忽略?
- 编辑 -
如果有缓解因素或其他解决方法,请给我简单的示例代码或链接.
当没有定义逆时,我没有看到任何方法来遍历关系的逆,所以我将假设构建自定义DQL 实际上不是一个解决方案 - 有一些与SQL 无关的连接是不可能的无论如何,DQL和水合作用可能都行不通.这就是为什么我不明白为什么添加反向关系是一个坏主意.
嗨,我有一个可行的DQL(我从一开始就得到了所有的事件):
DoctrineHelper::getEntityManager()->createQueryBuilder()
->select("u.surname, count(u.surname) as total")
->from("User", "u")
->from("AbstractEvent", "e")
->from("Attendance", "a")
->where("u = a.attendee")
->andWhere("e = a.event")
->andWhere("a.status=1")
->andWhere("e.date<CURRENT_TIMESTAMP()")
->groupBy("u.email")
->orderBy("total","desc");
Run Code Online (Sandbox Code Playgroud)
但这个没有(我只想这个月的活动):
DoctrineHelper::getEntityManager()->createQueryBuilder()
->select("u.surname, count(u.surname) as total")
->from("User", "u")
->from("AbstractEvent", "e")
->from("Attendance", "a")
->where("u = a.attendee")
->andWhere("e = a.event")
->andWhere("a.status=1")
->andWhere("e.date<CURRENT_TIMESTAMP()")
->andWhere("e.date>?", date('Y-m-d 00:00:00', strtotime('-'.(date('j')-1).' day')) )
->groupBy("u.email")
->orderBy("total","desc");
Run Code Online (Sandbox Code Playgroud)
我的error.log有这一行:
#0 /var/www/Doctrine/ORM/Query/AST/InputParameter.php(46): Doctrine\\ORM\\Query\\QueryException::invalidParameterFormat('?')
Run Code Online (Sandbox Code Playgroud)
这个日期的print_r给了我:2011-08-01 00:00:00这是正确的.
这是日期的映射:
/**
* Date of the event.
* @Column(type="datetime")
*/
private $date;
Run Code Online (Sandbox Code Playgroud)
任何帮助表示感谢!
执行此DQL查询时出现奇怪的错误:
SELECT u FROM User u LEFT JOIN u.schedule s WHERE DATE(s.timestamp) = DATE(NOW())
Run Code Online (Sandbox Code Playgroud)
Doctrine抛出异常并显示以下消息:
Expected known function, got 'DATE'
Run Code Online (Sandbox Code Playgroud)
该问题看起来与此错误类似,但是它解决了GROUP BY子句中的DATE()函数,并且对于Doctrine 2.2,该错误已关闭.此时,我得到了doctrine 2.4-DEV的例外.
该查询旨在选择今天安排的所有用户.有什么方法可以创建这个DQL吗?我在phpMyAdmin中测试了SQL版本,并且查询不会引发错误.可能有什么问题?
我正在尝试在Doctrine2中的IN语句中使用子查询.
以下是原始SQL查询的外观:
SELECT * FROM license
WHERE id
IN (SELECT id
FROM license
WHERE subscription = x
ORDER BY date DESC
LIMIT 5)
ORDER BY name ASC;
Run Code Online (Sandbox Code Playgroud)
我想要做的是显示按名称排序的最后5个结果,所以我必须首先查询最后5个结果,然后在主查询中按名称排序.
问题是我似乎无法限制内部查询.
这是我目前的代码:
$qb = $this->createQueryBuilder('l');
$qb->select('l.id');
$qb = $this->whereSubscriptionId($qb, $subscription_id);
$qb = $this->offsetLimitOrder($qb, 0, 5, 'deliveryDatetime desc');
//Second Query, adds the "order by X"
$qb2 = $this->createQueryBuilder('l2');
$qb2->add('where', $qb2->expr()->in('l2.id', $qb->getQuery()->getDQL()));
if(isset($order)){
$order = explode(' ', $order);
$qb2->addOrderBy('l2.'.$order[0], $order[1]);
}
return $qb2->getQuery()
->getResult();
Run Code Online (Sandbox Code Playgroud)
正如您所看到的,我创建了我的第一个查询,我订购并限制它(通过自定义方法)然后我尝试在第二个查询中使用它.
但是,似乎LIMIT不是DQL语句的一部分,因为当我var_dump第一个查询的DQL时,LIMIT不存在,这意味着当我运行$ qb2-> getQuery() - > getResult()时,它被完全忽略.
我通过启动第一个查询并在第二个查询中手动输入结果来实现它,但它很难看.
关于如何正确地做到这一点的任何想法?
谢谢 …
这应该很简单,但我找不到一个有效的例子.这是一个控制器方法,它抛出错误"无效的参数号:绑定变量的数量与令牌的数量不匹配".我成功发布了"searchterm"变量,但无法使查询生效.缺什么?谢谢!
public function searchAction()
{
$request = $this->getRequest();
$searchterm = $request->get('searchterm');
$em = $this->getDoctrine()->getEntityManager();
$query = $em->createQuery("SELECT n FROM AcmeNodeBundle:Node n WHERE n.title LIKE '% :searchterm %'")
->setParameter('searchterm', $searchterm);
$entities = $query->getResult();
return array('entities' => $entities);
}
Run Code Online (Sandbox Code Playgroud) 我有一个表,其中存在一个列,其中存储了各种值.我想使用dql从该表中检索唯一值.
Doctrine_Query::create()
->select('rec.school')
->from('Records rec')
->where("rec.city='$city' ")
->execute();
Run Code Online (Sandbox Code Playgroud)
现在我只想要唯一的价值观.谁能告诉我怎么做......
编辑
表结构:
CREATE TABLE IF NOT EXISTS `records` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`state` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
`city` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
`school` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=16334 ;
Run Code Online (Sandbox Code Playgroud)
这是我正在使用的查询:
Doctrine_Query::create()
->select('DISTINCT rec.city')
->from('Records rec')
->where("rec.state = '$state'")
// ->getSql();
->execute();
Run Code Online (Sandbox Code Playgroud)
为此创建Sql给了我:
SELECT DISTINCT r.id AS r__id, r.city AS r__city FROM records r WHERE r.state = 'AR'
Run Code Online (Sandbox Code Playgroud)
现在检查生成的sql …
根据DDC-2204问题说明
[SELECT by Equals]可以通过在SELECT子句中包含条件,对其进行别名,然后使用它来支持.您可能需要使用"AS HIDDEN name"来防止它出现在结果中
以下DQL应该是可能的:
SELECT main.id = 1 AS test FROM Entity main ORDER BY test
Run Code Online (Sandbox Code Playgroud)
但是,当我尝试这个(使用2.4)时,我得到了
Error: Expected Doctrine\ORM\Query\Lexer::T_FROM, got '='
Run Code Online (Sandbox Code Playgroud)
似乎开发人员建议的将条件放入SELECT的方法不起作用.这是一个错误和/或是否存在按条件选择和/或排序的另一种方式.
如果帖子和标签之间存在多对多关系,我该如何选择包含特定标签的帖子?
更新:
我遇到的问题是,由于 where tag.name = 'xxx',只选择了那个标签。我想要的是选择所有指定了标签的帖子,tgt 及其所有标签,例如。
Post 1 -> tag1, tag2
Post 2 -> tag1, tag3
Post 3 -> tag2, tag3
Run Code Online (Sandbox Code Playgroud)
目前我得到的是
Post 1 -> tag2 // missing tag1
Post 3 -> tag2 // missing tag3
Run Code Online (Sandbox Code Playgroud) 我使用Symfony 2和Doctrine.在我的数据库MySQL中,我有一个类型的字段DateTime.在我的Repository文件中,通过使用QueryBuilder,我想在我的Where子句中仅按日期(没有时间)和仅按时间(没有日期)搜索此表.
我怎么能意识到这一点?
dql ×10
doctrine ×7
doctrine-orm ×7
mysql ×3
symfony ×2
datetime ×1
limit ×1
one-to-many ×1
php ×1
subquery ×1
symfony1 ×1
where-clause ×1