自定义表单字段类型和用户定义的功能

时间:2011-12-09 08:30:41

标签: symfony doctrine-orm

这是我的第一个问题,但我希望我会得到很多帮助:) 所以,这是我几天前遇到的问题。

对于项目,我需要一个自定义表单字段,允许用户选择数字范围。

示例:

Number: greater-than 3 and lower-or-equal-than 5

我设法创建自定义表单字段类型就好了。我已经在我的存储库中创建了一个自定义方法,它附加了where子句部分和整个工作。

最近我需要在我的项目中的其他几个地方使用相同的组件。现在,我讨厌重复,所以我决定修改DQL的逻辑必须驻留在一个中心位置。根据Doctrine中给出的功能,这必须是UDF(用户定义的函数)。

我继续尝试实施UDF,但无济于事。

我已经设法学习并使用了Doctrine ORM包中的Parser和Lexer组件,但在我看来这还不够。

为了深入解释,以下是生成的查询:

SELECT something FROM SomeBundle:Something something
WHERE in_range(someProperty, gt, 3, lte, 5)

必须转变为:

SELECT sometable.* FROM sometable sometable
WHERE someProperty > 3 AND someProperty <= 5

我很好解析它,但是Doctrine2在UDF之后需要一个条件运算符,所以语法应该是这样的:

SELECT sometable.* FROM sometable sometable
WHERE in_range(someProperty, gt, 3, lte, 5) = 1

使用这种语法,仍然需要为所有参数分配值(例如:gt和lte),这也需要一个单独的函数来跟踪已经分配了哪些参数,哪些参数不是。此外,这个解决方案似乎不起作用,因为解析器似乎有解析我的函数参数的问题:D

我只需要简单的查询修饰符。

如果可能的话,我也希望获得更好的语法。这样的事情是可以接受的:

someProperty is in_range(gt, 3, lte, 5)

有什么想法?提前感谢所有参与者!

P.S根据Doctrine2站点,UDF旨在用于“实现供应商特定功能”。也许我没有为我的问题寻找合适的解决方案。有什么建议吗?

2 个答案:

答案 0 :(得分:0)

为什么不使用BETWEEN(http://www.doctrine-project.org/docs/orm/2.1/en/reference/dql-doctrine-query-language.html#dql-select-examples)?

答案 1 :(得分:0)

我最终实现了自己的Expr课程。

一些优点包括:

  • 您不必使用特定参数,因此您可以随心所欲地传递给自己
  • 您可以按照需要的方式制作查询,因为它返回要使用的查询的__toString()方法

这里需要注意的是,目前Doctrine2不支持自定义Expr类,所以为了使用我的,我必须使用__toString()方法并检查结果是否为空,然后再将其传递给andx查询构建器的()/ orx()方法。