Php Symfony2+;条令';s查询生成器-其中!=1.
我有一个函数,可以创建对数据库的查询,如下所示:Php Symfony2+;条令';s查询生成器-其中!=1.,php,symfony,doctrine,Php,Symfony,Doctrine,我有一个函数,可以创建对数据库的查询,如下所示: public function getList($u, $t, $ls, $lf) { return $this->getEntityManager() ->createQuery(' SELECT o, u, g
public function getList($u, $t, $ls, $lf) {
return $this->getEntityManager()
->createQuery('
SELECT
o,
u,
g,
r,
t,
p
FROM GameShelfUsersBundle:Own o
LEFT JOIN o.user u
LEFT JOIN o.game g
LEFT JOIN o.rate r
LEFT JOIN o.typo t
LEFT JOIN o.platforms p
WHERE u.id = :user
AND o.typo = :type
ORDER BY o.updated DESC
')
->setParameters(array(
'user' => $u,
'type' => $t
))
->setMaxResults($lf)
->setFirstResult($ls)
->getResult();
}
$type = '!= 1'
...
AND o.typo :type
...
'type' => $type
我的问题是,如何设置:键入为不在中?我是说,我想这样使用它:
public function getList($u, $t, $ls, $lf) {
return $this->getEntityManager()
->createQuery('
SELECT
o,
u,
g,
r,
t,
p
FROM GameShelfUsersBundle:Own o
LEFT JOIN o.user u
LEFT JOIN o.game g
LEFT JOIN o.rate r
LEFT JOIN o.typo t
LEFT JOIN o.platforms p
WHERE u.id = :user
AND o.typo = :type
ORDER BY o.updated DESC
')
->setParameters(array(
'user' => $u,
'type' => $t
))
->setMaxResults($lf)
->setFirstResult($ls)
->getResult();
}
$type = '!= 1'
...
AND o.typo :type
...
'type' => $type
但它根本不起作用。使用$type=-1
也没有帮助。除了创建if/else语句和复制查询之外,还有其他方法吗?为什么不使用
通过这种方式,您可以根据某些条件轻松自定义查询
这是一个例子:
$q = $this
->createQueryBuilder('foo')
->select('foo')
->leftJoin('foo.bar', 'foobar')
->leftJoin('foobar.bar', 'foobarbar')
;
if($myVar > 0)
{
$q->where('foobarbar.var = :myVar');
}
else
{
$q->where('foobarbar.var = :staticValue');
}
[...]
记住调用return$q->getResult()代码>在结尾使用我的查询时,查询时间
为3.08毫秒。使用与查询生成器生成的同一查询时,查询时间
超过9毫秒。这仅适用于伪数据。@TomekBuszewski:如果要创建查询,请基于if…then…else语句(无重复的“代码”)这是唯一的方法:你不要问“最快”的方法,我用的是丑陋的功能性重复query1 | query2
。不幸的是,QueryBuilder花费了太多的时间(三倍多),即使代码更加优雅和简单。query1 | query2还意味着,如果您有另一个条件,在将来,您将有query3,如果您必须更改查询中的某些内容,您必须沿着所有这些条件复制它。想想看;)