2011-12-09 9 views
0

これは私の最初の質問ですが、私は多くの助けを得ることを願っています:) これは数日前に直面した問題です。カスタムフォームフィールドタイプとそのためのユーザ定義関数

プロジェクトでは、ユーザーが数値範囲を選択できるカスタムフォームフィールドが必要です。

例:

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は、後に条件演算子が必要です構文は次のようになります。

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()メソッドを使用して、結果は空ではなく、それを渡す前にoクエリービルダーのandx()/ orx()メソッド。

0

なぜBETWEEN(http://www.doctrine-project.org/docs/orm/2.1/en/reference/dql-doctrine-query-language.html#dql-select-examples)を使用しないでください。 )?

+0

ユーザーは比較条件を指定できる必要がありますが、()より大きいか等しいか小さいかの間に強制します。私が他の方法で成功しなかった場合、これは私の後退になります。 –

関連する問題