2012-07-17 9 views
6

Doctrineクラスで作業しているときにカスタムクエリが必要なときに、DQLとSQLを使用/学習する理由をいくつか教えてください。Doctrineでは、SQL上でDQLを使用するメリットは何ですか?

ORMの組み込みリレーショナル機能を使用して何かを達成できない場合は、通常、拡張DoctrineまたはDoctrineTableクラスでカスタムメソッドを作成します。この方法では、適切なプリペアドステートメント/注入保護などでPDOを使用して、必要なSQLを直接SQLに書き込みます。 DQLは、ほとんどの一般的な状況で使用するのに十分な説得力のある理由を提供していないように見える、学習/デバッグ/保守の追加言語のようです。 DQLはSQLよりもはるかに複雑ではないようですが、実際にはSQLの知識がなくてもDQLを効果的に使用することはできません。ほとんどのコアSQL構文ポートは、PHPで使用する最も一般的なDB全体でかなりよく機能します。

私は見逃していますか?理由があると確信していますが、意図的にそれを意図的に使用した人から聞いてみたいと思います。

私は、従来のLAMPセットアップ(mysql、postgresなどを使用して、コアの 'get-by-relationship'タイプのニーズを外れることを必要とする場合、ORMをサポートする引数は探していません... )

+3

実際にサポートされている引数はありませんが、名前の関係が結合条件よりも使いやすく、エラーが発生しにくく、書き込みが面倒です。 –

答えて

3

正直言って、私はDoctrine1.2を使用してSQLを学んだ:)私は外国キー、カスケード操作、group_concatなどの多くの他の多くの機能を認識していませんでした。インデックス付き検索は、すぐに使える非常に便利で便利なものです。

DQLはコードを書いて理解するのがはるかに簡単です。たとえば、次のクエリ:

$query = ..... // some query for Categories 
    ->leftJoin("c.Products p") 

は、それは、カテゴリと製品の間の結合を残さないだろうと、あなたはp.category_id = c.idをON記述する必要はありません。

そして、今後、one-2-manyからmany-2-manyと言うように関係を変更する場合、この同じクエリは何も変更せずに動作します。 Doctrineはそれを世話します。 SQLを使用してこれを行う場合、すべてのクエリを変更して、その中間のmany-2-manyテーブルを含める必要があります。

+0

+1、特にオブジェクト間の関係(外部キー)は既に接続されていますBaseクラスの – KJA

+1

@Zeljkoが受け取った回答のうち、関係タイプの変更に関するあなたの答えの最後のポイントは、私の状況にとって唯一の魅力的なものです。私はリレーショナルデータベースの作業が初心者にとってどのように優れているのか理解できない人にとっては、なぜ長期的には必ずしもベストではないのかということについてはあまり心配していません。また、ON句に注意してください...時には、ON句の中にあるキー以外にも条件を追加したいと思っています.DQLはそれを私が知る限りサポートしていません。これは、あなたがする必要があるものの大部分のための簡単な例ですが、特定の状況で使用することは非常に困難です。 – Ray

+0

あなたは正しいです、あなたは追加節を持っています。その場合、DQLは 'WITH'文を提供します。はい; 1つ2つ、1つ2つの多く、多くの2つの多くとも...コードの変更なしで動作します。 私のアドバイス:試してみてください。一度あなたが夢中になると、あなたは戻ってこないでしょう。それはメルセデスとボトムレベルのユーゴーのクラストップを走らせるようなものだ。どちらもA地点からB地点に向かいますが、Yugoのために形成された線はありません。 – Zeljko

2

私はDQLをより読みやすく、使いやすいと感じました。正しく構成すると、オブジェクトを結合するのがより簡単になり、照会はより簡単に作成できます。

あなたのコードは、どのRDBMSにも簡単に移行できます。

DQLは、リレーショナルスキーマではなく、オブジェクトモデルのオブジェクトクエリ言語です。

+0

私はあなたの最初のものが定性だと思います - 単純なSQLクエリーで対処できるタスクを達成するために、複雑なDQLを実際に見ました。あなたの2番目の点は私が完全に同意しますが、私の質問で指摘したように、DQLが達成できるすべてのことをカバーするために必要な基本的なSQLに対する懸念はありません。あなたの最後のポイントは、それを見るための最も魅力的な方法です。これは、基礎となるストレージではないオブジェクトのクエリ言語です。オブジェクトのクエリ言語の主なメリットは何ですか?パフォーマンスが向上しますか?それはよく検査されたOOパターンをサポートしていますか?それはより効率的な/より良いコードを可能にしますか? – Ray

+0

Doctrine 1.2を使った後の@Ray、それはパフォーマンスにとって本当に有害です。 – KJA

+0

doctrineが生成したモデルクラス(TestTable、BastTest、Test)と、それらを適切に処理する方法、コントローラーを呼び出す人を理解するためのリファレンスがありますか? 私の質問をご覧くださいhttp://stackoverflow.com/questions/11529224/doctrine-table-vs-class-that-extends-from-baseclass – KJA

1

DQLを使用すると、オブジェクトを処理するのに役立ちます。 databaeに挿入する場合 、あなたはdatabaeから選択する場合には

$test = new Test(); 
$test->attr = 'test'; 
$test->save(); 

オブジェクトを挿入します、あなたは、アレイを選択し、その後、あなたのオブジェクトに

public function getTestParam($testParam) 
    { 
     $q=Doctrine_Query::create() 
       ->select('t.test_id , t.attr') 
       ->from('Test t ') 
      $p = $q->execute(); 
      return $p; 
    } 

それを埋めることができ、あなたは確認することができますDoctrineドキュメンテーション詳細については、

1

ゼリコの答えはかわいいスポットオンです。

私の本では、生のSQLの代わりにDQLを使う最も重要な理由があります。Doctrineはエンティティをデータベースに保存されている方法から分離しています。つまり、基本的なストレージの変更に応じてエンティティを変更する必要はありません。これはつまり、基礎となるストレージの変更(列の名前の変更、リレーションシップの変更など)を行う場合は、DQLでエンティティプロパティを使用するため、DQLに触れる必要はありませんあなたの現在のマッピングに応じて、SQLを修正するためにシーンの裏に翻訳されます)。

+0

過去1ヶ月間アプリを操作した後、データベースに多くの変更を加えた後、私はこの回答に同意します。 – kiwicomb123

関連する問題