0

めちゃくちゃに見えますが、参考にしてみてはいかがでしょうか?

http://www.doctrine-project.org/documentation/manual/1_1/en/dql-doctrine-query-language%3Abnf

4

2 に答える 2

3

実際、人間が参考として使用しているとは思いません。しかし、誰かが BNF を理解する自動ツールを使用したい場合に役立つかもしれません。たとえば、ある種のコード ジェネレーターです。

BNF の利点は、言語を記述する正式な方法であることです。プログラムの場合、英語よりもはるかに理解しやすいです。


参考のため :



コメントの後に編集: DQL/オブジェクトに関する簡単な例を次に示します。

オブジェクト指向 API を使用してクエリを記述し、実行し、結果を取得するコードのこの部分を考えてみましょう(配列としてハイドレート -- デバッグ時に、このようにデータのみを出力します)

$result = Doctrine_Query::create()
    ->select('p.id, p.title, u.login')
            ->from('Ab_Model_Post p')
            ->innerJoin('p.User u')
            ->where('p.codeStatus = ?')
            ->orderBy('p.date desc')
            ->limit(2)
            ->execute(array('OK'), Doctrine::HYDRATE_ARRAY);
var_dump($result);

そして、ここにあなたが得る出力の種類があります:

array
  0 => 
    array
      'id' => string '7' (length=1)
      'title' => string 'Septième post' (length=14)
      'User' => 
        array
          'id' => string '1' (length=1)
          'login' => string 'user1' (length=5)
  1 => 
    array
      'id' => string '6' (length=1)
      'title' => string 'Sixième post (draft=7)' (length=23)
      'User' => 
        array
          'id' => string '1' (length=1)
          'login' => string 'user1' (length=5)

もちろん、これはスキーマとモデルのクラスが問題ないことを考慮したものです -- フランス語の例で申し訳ありませんが、フランス語で書かれた Doctrine のデモンストレーションのために、以前にセットアップしたスキーマ/モデル/データベースを使用しました。

基本的に、DB はブログ アプリケーション用であり、ここでは :

  • 投稿とそれらを投稿したユーザーからデータを取得する
  • 有効な投稿
  • 最近の投稿
  • 2つの投稿のみ


ここで、「疑似 SQL 言語」のように「DQL」が意味するものを使用した、同等のものを次に示します。

$result = Doctrine_Query::create()
    ->query(<<<DQL
select p.id, p.title, u.login
from Ab_Model_Post as p, 
    p.User u
where p.codeStatus = ?
order by p.date desc
limit 2
DQL
    , array('OK'), Doctrine::HYDRATE_ARRAY);
var_dump($result);

ここにはオブジェクト指向 API はありません(つまり、クエリを書くためです) : 私が考えていた疑似 SQL だけを書きました。これは、私が知る限り、BNF が説明しているものです。

そしてもちろん、 の出力var_dumpは以前に取得したものとまったく同じです。


これで物事がもう少し明確になることを願っています:-)

于 2010-02-25T17:06:41.860 に答える
0

それは、文脈自由文法を記述する方法である Backus-Naur Form です。このウィキペディアの記事を参照してください。

于 2010-02-25T17:05:48.527 に答える