2011-12-09 49 views
0

这是我的第一个问题,但我希望我会得到很多帮助:) 所以,这是我几天前面临的问题。自定义表单字段类型和用户定义的函数为它

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

例子:

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

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

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

我继续前进,试图实施UDF,无济于事。

我已经学会了使用Doctrine ORM包的解析器和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

我最终实现了自己的Expr类。

一些优点包括:

  • 您并不局限于使用特定的参数,这样你就可以把自己通过任何你需要
  • 你可以精心查询你需要的方式,因为它的__toString()使用

一件事,返回查询方法,这里要注意的是,目前Doctrine2不支持自定义Expr的类,所以为了用我,我只好用__toString()方法,并检查结果不是空的,在通过之前t o查询生成器的andx()/ orx()方法。

0

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

+0

用户需要能够指定比较条件,而()之间的力量大于或等于和小于或等于。如果我没有以其他方式成功,这将是我的后备。 –

相关问题