【问题标题】:Doctrine 2 - How to search with DQL and groupingDoctrine 2 - 如何使用 DQL 和分组进行搜索
【发布时间】:2024-04-20 02:45:01
【问题描述】:

我不知道如何将我的 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

这很好用,但现在我想让这些搜索结果按年份和日期(而不是时间)分组,所以我的项目像这样分组

1 月 27 日:

  • 事件 1
  • 事件 2

1 月 28 日:

  • 事件 3
  • 事件 4

而且我还需要做的是把它分组到我的类别中,这样我最终将拥有:

1 月 27 日:

  • 类别 1
    • 事件 1
    • 事件 2
  • 类别 2
    • 事件 3

我的数据库事件表:

  • 名称 varchar(255)
  • 描述 varchar(255)
  • 创建日期时间
  • place_id int(11)
  • 事件日期日期时间
  • organiser_id int(11)
  • created_user_id int(11)
  • 类别 int(11)

我的数据库类别表

  • id int(11)
  • 名称 varchar(255)
  • 描述 varchar(255)

我有一个事件实体和一个 EventCategory 实体,而 EventCategory 所做的只是将类别 ID 绑定到事件实体上

--更新 - 我的 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->register();

【问题讨论】:

    标签: doctrine doctrine-orm dql


    【解决方案1】:

    您无需编写自己的函数或安装第三方库。由于datetime是以字符串形式存储的,所以你可以使用Doctrine's functionSUBSTRING()来提取某个部分并按它分组。

    例如:

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

    【讨论】:

      【解决方案2】:

      您需要使用日期函数 DAY、MONTH 或 YEAR (Mysql) Doctrine as is 不支持这些功能,所以您需要自己编写 (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
      

      【讨论】:

      • 感谢您的回复。我已经安装了您所说的 DoctrineExtensions,但是当我尝试执行 GROUP BY year 语句时,我得到:“错误:无法按未定义的标识或结果变量分组。 " .. 看看我在上面的帖子中尝试在 dql 中做什么 ..
      • 已经使用 DoctrineExtensions\Query\Mysql 在文档的顶部
      • 你的原始 sql 对我有用,你能用分组显示你的 DQL 吗?
      • 我还建议做一个简单的 DQL,只是为了检查(类似于:SELECT eventdate GROUP BY YEAR(eventdate))
      • 在我的 DQL 中,我有:SELECT eventdate FROM \Entities\Event e GROUP BY YEAR(e.eventdate) 但它仍然显示:错误:无法按未定义的标识或结果变量分组。
      最近更新 更多