【问题标题】:Doctrine2 and where sql statementDoctrine2 和 where sql 语句
【发布时间】:2016-09-18 18:57:55
【问题描述】:

我有一个这样写的学说查询:

    $qb = $this->createQueryBuilder('u');

    $qb
        ->leftJoin('u.relatedEventTypes', 'relatedEventTypes')
        ->leftJoin('u.relatedGenres', 'relatedGenres')
        ->where(
            $qb->expr()->eq('u.type', ':userType')
        )
        ->setParameter('userType', 'dj')
    ;

我想再添加一个 where 语句,用于查找两个坐标之间的距离并处理该数据。查询如下所示:

    $qb
       ->andWhere(
          '( 6371 * acos( cos( radians(lat_placeholder) ) * cos( radians(lat_placeholder) ) * cos( radians(lng_placeholder) - radians(lng_placeholder) ) +
           sin( radians(lat_placeholder) ) * sin( radians(la t_placeholder) ) ) ) AS distance
           HAVING distance < distanceToTravel_placeholder)'
     ;

我找不到一种方法来完成这项工作,这意味着我无法弄清楚如何使用占位符来编写它,因此我可以从一开始就使用查询中的变量(例如 u.locLat、u.distanceToTravel 等) .有可能吗?

【问题讨论】:

  • 您应该首先在 andWhere 方法中删除 LIMITORDER BY
  • 我只是使用了原始的 sql 查询,当然 limit 和 order by 语句不属于那里,但我认为这会让我的问题更精确

标签: mysql sql symfony doctrine-orm


【解决方案1】:

我认为教义无法处理所有函数,如 acos、cos 和弧度。您应该查看 Doctrine DBAL 或 Doctrine native queries,其中 DBAL 看起来像 PDO,本机查询为您提供了使用普通 mysql 查询填充实体的可能性。

【讨论】:

  • andWhere 语句中是普通的 sql,并且 sql 支持所有这些功能。问题是是否可以用占位符将其写在教义中。
  • sql 确实支持这些功能,但 DQL 不支持
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-10
  • 2015-09-28
  • 2017-01-02
  • 2014-05-26
相关资源
最近更新 更多