这是我的第一个问题,但我希望我会得到很多帮助:) 所以,这是我几天前遇到的问题。
对于项目,我需要一个自定义表单字段,允许用户选择数字范围。
示例:
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旨在用于“实现供应商特定功能”。也许我没有为我的问题寻找合适的解决方案。有什么建议吗?
答案 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课程。
一些优点包括:
这里需要注意的是,目前Doctrine2不支持自定义Expr类,所以为了使用我的,我必须使用__toString()方法并检查结果是否为空,然后再将其传递给andx查询构建器的()/ orx()方法。