2011-08-13 7 views
1

DQLでクエリを書くのはちょっと混乱します。DQL(Doctrine 2)の名前空間でバックスラッシュをエスケープする

$query = $em->createQuery('SELECT u FROM MyProject\Model\User u WHERE u.age > 20'); 

名前空間のバックスラッシュはエスケープされていない理由:公式ドキュメントから ?
その理由からZend Studioで警告が出ていますが、とにかく動作しますが、\ Mも\ Uも有効なエスケープシーケンスではないので、 "運が良かった"と思います。

あなたはどう思いますか?その構文を使用するのは安全ですか? DQLの "\"を常にエスケープする方が良いでしょうか?

$query = $em->createQuery('SELECT u FROM MyProject\\Model\\User u WHERE u.age > 20'); 

答えて

1

最初の構文は、単に幸運であるようDynamic namespace names (quoted identifiers) should escape backslash

が見える参照してください。 :)私は自分自身でそれを試していないので、エスケープするクエリーは、エスケープしないクエリーと同じように機能します。エスケープされたクエリーを使用する方がよいでしょう。

+0

Btw、私は自分のプロジェクトでいくつかの作業コードをチェックしました...単一のバックスラッシュは二重引用符で囲まれた文字列の中でも機能します。これをクラッシュさせる唯一の方法は、\で囲まれたエスケープシーケンスを構成する文字の前に二重引用符で囲まれた文字列を使用することです。 – J0HN

+0

はい、Doctrineのドキュメントは本当に間違っています。つまり、例の名前は大文字であるため(つまり、エスケープシーケンスは作成できません)、その例はうまくいきますが、ベストプラクティスはバックスラッシュをエスケープすることですリンクJOHN! – Enrique

0

良い点ですが、DQLはクエリを受け取り、名前空間とクラスに一致して、解析されたクエリをデータベースエンジンに送信します。

MyProject \ Model \ Userは、Userクラスで指定されたテーブル名に切り捨てられます。

はWHERE u.age> 20

> 20 u.ageが

は、ユーザからのuを選択となりMyProjectと\モデル\ユーザーのu [Userクラスに指定されたすなわちテーブル名] UからのUを選択します

+0

はい私たちのDQLは最終的なクエリではありませんが、 "createQuery"は文字列を受け取り、文字列はどこでも文字列であり、文字列のバックスラッシュは特殊文字です。実際には、バックスラッシュをエスケープせずにDQL(文字列)をどのように動作させることができるのか分かりません。 \ new \ Tableのような名前空間があるとどうなりますか?文字列 "\ n"の内側は新しい行として解釈されませんか? DQLでバックスラッシュをエスケープすると、警告は表示されません。もちろん、クエリは期待通りに機能します。私はそれが "正しい"方法だと思うが、なぜDQLでバックスラッシュをエスケープしているのか理解できない。 – Enrique