标签: dql

Doctrine:Multiple(whereIn OR whereIn)查询?

我在使用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 symfony1 where-clause dql

13
推荐指数
1
解决办法
2万
查看次数

何时在Doctrine2中维持反向关系是否值得?

在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和水合作用可能都行不通.这就是为什么我不明白为什么添加反向关系是一个坏主意.

doctrine relational-database one-to-many dql doctrine-orm

13
推荐指数
1
解决办法
934
查看次数

Doctrine DQL Date作为参数问题

嗨,我有一个可行的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)

任何帮助表示感谢!

php mysql dql doctrine-orm

13
推荐指数
2
解决办法
3万
查看次数

在带有DQL的WHERE子句中使用DATE()函数

执行此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版本,并且查询不会引发错误.可能有什么问题?

doctrine dql doctrine-orm

13
推荐指数
1
解决办法
1万
查看次数

学说2限制IN子查询

我正在尝试在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()时,它被完全忽略.

我通过启动第一个查询并在第二个查询中手动输入结果来实现它,但它很难看.

关于如何正确地做到这一点的任何想法?

谢谢 …

subquery limit dql doctrine-orm

13
推荐指数
1
解决办法
2598
查看次数

如何在Symfony2中进行LIKE数据库查询

这应该很简单,但我找不到一个有效的例子.这是一个控制器方法,它抛出错误"无效的参数号:绑定变量的数量与令牌的数量不匹配".我成功发布了"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)

doctrine dql query-builder symfony doctrine-orm

12
推荐指数
3
解决办法
3万
查看次数

如何使用dql从数据表中获取唯一值?

我有一个表,其中存在一个列,其中存储了各种值.我想使用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 …

mysql doctrine dql

11
推荐指数
2
解决办法
2万
查看次数

Doctrine:使用equals不接受的Select语句

根据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的方法不起作用.这是一个错误和/或是否存在按条件选择和/或排序的另一种方式.

doctrine dql doctrine-orm

11
推荐指数
1
解决办法
461
查看次数

SQL 如何查询多对多关系

如果帖子和标签之间存在多对多关系,我该如何选择包含特定标签的帖子?

更新:

我遇到的问题是,由于 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)

doctrine dql

10
推荐指数
1
解决办法
1万
查看次数

在Symfony2和Doctrine中的DateTime字段中按时间搜索

我使用Symfony 2和Doctrine.在我的数据库MySQL中,我有一个类型的字段DateTime.在我的Repository文件中,通过使用QueryBuilder,我想在我的Where子句中仅按日期(没有时间)和仅按时间(没有日期)搜索此表.

我怎么能意识到这一点?

mysql datetime dql symfony doctrine-orm

10
推荐指数
1
解决办法
7536
查看次数