Doctrine2新语法

时间:2016-07-10 19:25:17

标签: php mysql doctrine-orm

http://sqlfiddle.com/#!9/b2b34e/7

我正在试图弄清楚如何使用Doctrine2的新语法编写以下内容:

SELECT
  id, username, (
    6371 * acos (
      cos ( radians(53.3646732) )
      * cos( radians( latitude ) )
      * cos( radians( longitude ) - radians(-6.235036) )
      + sin ( radians(53.3646732) )
      * sin( radians( latitude ) )
    )
  ) AS distance
FROM users
HAVING distance < 50
ORDER BY distance
LIMIT 0 , 20;

到目前为止,我已经尝试过这个:

$query = $em->createQuery('
          SELECT NEW GU\UserBundle\Model\NearbyUser(u.id, 
            6371 * acos (
              cos ( radians(53.3646732) )
              * cos( radians( u.latitude ) )
              * cos( radians( u.longitude ) - radians(-6.235036) )
              + sin ( radians(53.3646732) )
              * sin( radians( u.latitude ) )
            )
          ) 
          FROM GU\UserBundle\Entity\User u');

如何将此部件设置为名为distance的变量而不会抛出错误,以便我可以使用HAVING distance < 50

6371 * acos (
      cos ( radians(53.3646732) )
      * cos( radians( latitude ) )
      * cos( radians( longitude ) - radians(-6.235036) )
      + sin ( radians(53.3646732) )
      * sin( radians( latitude ) )
    )
  ) AS distance

更新 我不认为我正确地做这一部分:

$query = $em->createQuery('
          SELECT NEW GU\UserBundle\Model\NearbyUser(u.id, 
            (6371 * acos (
              cos ( radians(53.3646732) )
              * cos( radians( u.latitude ) )
              * cos( radians( u.longitude ) - radians(-6.235036) )
              + sin ( radians(53.3646732) )
              * sin( radians( u.latitude ) )
            )) as distance
          ) 
          FROM GU\UserBundle\Entity\User u');

给出错误:

  

[语法错误]第0行,第367行:错误:预期   Doctrine \ ORM \ Query \ Lexer :: T_FROM,得到')'

1 个答案:

答案 0 :(得分:1)

据我所知,您无法使用SELECT NEW语法执行此操作,而您尝试执行的操作无论如何都是无效的语法,因此您有两个选择:

  1. 删除SELECT NEW并加载u.id, your formula here AS distance作为数组,然后根据需要创建实体(并将它们附加到实体管理器)。这将产生更少的行并且将更有效,因为您将需要更少的实体(或者如果您不打算坚持它们,可能不会需要任何实体)
  2. 延迟加载所有实体并按距离过滤它们,销毁所有未通过检查的实体释放空闲内存。这将消耗更多的资源,而不是推荐的方式。