Doctrine 2 - 如何使用DQL和分组进行搜索

时间:2012-10-29 18:10:10

标签: doctrine doctrine-orm dql

我无法弄清楚我如何将我的LIKE搜索与日期和DQL中的类别分组 ..

解释

我有一个搜索功能,可以在重量后搜索我的事件..它看起来像这样:

SELECT e as event,
  (CASE
     (e.name LIKE :searchterm) THEN 10
      ELSE 0
   END) +
   (CASE
      WHEN (e.name LIKE :searchtermFull) THEN 5
      ELSE 0
    END)

 AS weight

FROM
  \Entities\Event e

WHERE
  e.name LIKE :searchterm OR
  e.name LIKE :searchtermFull

  ORDER BY weight DESC

这样可以正常使用,但现在我希望将这些搜索结果按年份和日期(而不是时间)分组,以便我的项目按此分组

27 jan:

  • 活动1
  • event 2

28 jan:

  • 活动3
  • event 4

我还需要做的是将它分组我的类别,这样我最终会有:

27 jan:

  • 第1类
    • 活动1
    • 活动2
  • 第2类
    • 活动3

我的数据库事件表:

  • name varchar(255)
  • description varchar(255)
  • 创建日期时间
  • place_id int(11)
  • eventdate datetime
  • organiser_id int(11)
  • created_user_id int(11)
  • category int(11)

我的数据库类别表

  • id int(11)
  • name varchar(255)
  • description varchar(255)

我有一个Event Entity和一个EventCategory实体,EventCategory所做的只是将类别ID绑定到Event Entity

- 更新 - 我的sql到目前为止 -

SELECT 
    c.name, 
    YEAR(e.eventdate) as year, 
    MONTH(e.eventdate) as month, 
    DAY(e.eventdate) as day, 
    count(*) as total 
FROM `events` as e, `eventCategories` as c 
WHERE
    e.category = c.id
GROUP BY 
    YEAR(e.eventdate),  
    MONTH(e.eventdate),
    DAY(e.eventdate)

ORDER BY eventdate ASC

通过在自动装带器中写入来包含DoctrineExtensions:

$ classLoader = new Doctrine \ Common \ ClassLoader('DoctrineExtensions',ROOT.DS.“library”); $ classLoader->寄存器();

2 个答案:

答案 0 :(得分:2)

您无需编写自己的功能或安装第三方库。由于datetime存储为字符串,因此您可以使用Doctrine's function SUBSTRING()来提取某些部分和组。

例如:

SELECT SUBSTRING(e.eventdate, 1, 4) AS year FROM … GROUP BY year;

答案 1 :(得分:1)

您需要使用日期函数DAY,MONTH或YEAR( Mysql ) Doc原则不支持这些功能,因此您需要自己编写(DQL functions)或安装this library

按年,月分组记录

WHERE ... GROUP BY YEAR(eventdate), MONTH(eventdate) ORDER BY eventdate ASC

按年,月和日分组记录

WHERE ... GROUP BY YEAR(eventdate), MONTH(eventdate), DAY(eventdate) ORDER BY eventdate ASC